在身份验证上发送自定义参数

克里索

我是服务栈新手。我试图弄清楚如何在身份验证上发送自定义参数。据我了解,这是对客户端进行身份验证并在会话中执行一组呼叫的步骤

var jsonClient = new JsonServiceClient("http://localhost:55679/");
var authResponse = client.Send(new Authenticate
{
    provider = "myProvider",
    UserName = "user",
    Password = "pwd",
    RememberMe = true,
}); 
var jResponse = jsonClient.Get<CountriesResponse>(request);
Console.WriteLine(jResponse.Countries.Count);

到目前为止,我将我的apphost配置为以下内容,并且一切正常。

Plugins.Add(new AuthFeature(() => new CustomUserSession(), new IAuthProvider[] {
     new MyAuthProvider(), 
}));

如果我想发送具有相同自定义属性的MyAuthenticate请求而不是发送ServiceStack.Authenticate,该怎么办?

var authResponse = client.Send(new MyAuthenticate
{
    provider = "myProvider",
    UserName = "user",
    Password = "pwd",
    RememberMe = true,
    AppId = "AppId",
    ProjectId = "ProjectId"
});

我的目标是在验证用户身份时发送自定义参数,而不仅仅是在Authenticate内置请求所允许的范围内发送自定义参数,然后将这些额外的参数存储在CustomUserSession中。

谢谢

神话

发送有关QueryString或HttpHeaders的其他信息

由于您无法更改内置的AuthenticateRequest DTO,因此发送其他元数据的一种方法是在QueryString或HTTP上添加额外的信息Headers

如果您想使用.NET服务客户端来执行此操作,则需要使用RequestFilter,例如:

var client = new JsonServiceClient(BaseUrl) {
    RequestFilter = req => { 
        req.QueryString["AppId"] = appId;
        req.QueryString["ProjectId"] = appId;
    }
};

var authResponse = client.Send(new Authenticate { ... });

否则,使用ServiceStack的内置HTTP Utils创建自定义请求通常更为灵活,例如:

var url = "{0}/auth/myProvider".Fmt(BaseUrl)
    .AddQueryParam("AppId", appId)
    .AddQueryParam("ProjectId", projectId);

var authResponse = url.PostJsonToUrl(new Authenticate { ... });

在服务器上QueryString,您可以从IServiceBaseIRequestargs获取当前请求中的其他数据,例如:

public class CustomCredentialsAuthProvider : CredentialsAuthProvider
{
    ...
    public override IHttpResult OnAuthenticated(IServiceBase authService, 
        IAuthSession session, IAuthTokens tokens, Dictionary<string, string> authInfo)
    {
        ...
        var customSession = (CustomUserSession)session;
        customSession.AppId = authService.Request.QueryString["AppId"];
        customSession.ProjectId = authService.Request.QueryString["ProjectId"];
        return base.OnAuthenticated(authService, session, tokens, authInfo);
    }
}

Meta现在可以在身份验证请求DTO上使用自定义词典

为了使此用例更容易一点Dictionary<string,string> Meta,在AuthenticateDTO上添加了一个新属性,这使从Typed Service Clients进行调用变​​得更好一些,因为您不必使用过滤器,例如:

var client = new JsonServiceClient(BaseUrl);

var authResponse = client.Send(new Authenticate {
     ... 
     Meta = new Dictionary<string, string> { {"AppId", appId}, {"ProjectId", pId} },
});

您可以直接从Authenticate DTO访问它,例如:

var authRequest = (Authenticate)authService.Request.Dto;
customSession.AppId = authRequest.Meta["AppId"];
customSession.ProjectId = authRequest.Meta["ProjectId"];

Meta属性可从v4.0.35 +版本开始使用,该版本目前在MyGet上可用

使用您自己的自定义身份验证服务

能够使用您自己的MyAuthenticateDTO的更具破坏性的替代方法是在您自己的Service中处理身份验证请求,然后委派给AuthService,例如:

public class MyAuthenticate : Authenticate 
{ 
    public string AppId { get; set; }
    public string ProjectId { get; set; }
}

public class MyAuthServices : Service
{
    public object Any(MyAuthenticate request)
    {
        using (var auth = base.ResolveService<AuthenticateService>())
        {
            var response = auth.Post(request);
            var authResponse = response as AuthenticateResponse; 
            if (authResponse != null) {
                var session = base.SessionAs<CustomUserSession>();
                session.AppId = request.AppId;
                session.ProjectId = request.ProjectId;
                this.SaveSession(session);
            }
            return response;
        }
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在身份验证上发送自定义参数

来自分类Dev

LDAP:在身份验证事件期间获取自定义值

来自分类Dev

使用自定义身份验证修改请求参数

来自分类Dev

使用自定义身份验证修改请求参数

来自分类Dev

Laravel上的自定义身份验证

来自分类Dev

Laravel自定义身份验证

来自分类Dev

Laravel自定义身份验证

来自分类Dev

自定义ServiceStack身份验证

来自分类Dev

JMeter自定义身份验证

来自分类Dev

Django身份验证自定义

来自分类Dev

无法使用python社交身份验证设置自定义参数

来自分类Dev

无法使用python社交身份验证设置自定义参数

来自分类Dev

带有自定义提供程序和处理程序的Spring Security 4在身份验证之前不缓存URL

来自分类Dev

Django通道自定义身份验证中间件__call __()缺少2个必需的位置参数:“接收”和“发送”

来自分类Dev

Azure移动服务上的自定义身份验证未授权

来自分类Dev

在带有Servant的自定义阅读器Monad上使用身份验证

来自分类Dev

Docker容器上的解析服务器的自定义身份验证(OAuth2)

来自分类Dev

RESTful服务上的自定义手动Oauth2身份验证

来自分类Dev

在带有Servant的自定义阅读器Monad上使用身份验证

来自分类Dev

跳过自定义错误页面的身份验证

来自分类Dev

星号SIP自定义身份验证

来自分类Dev

使用ServiceStack返回自定义身份验证响应

来自分类Dev

Firebase自定义身份验证传递令牌

来自分类Dev

.NET MVC中Elmah的自定义身份验证

来自分类Dev

Web API 2自定义身份验证

来自分类Dev

自定义Spring身份验证中的角色访问

来自分类Dev

Laravel自定义身份验证过滤器

来自分类Dev

Meteor.js中的自定义身份验证

来自分类Dev

未调用自定义身份验证提供程序

Related 相关文章

热门标签

归档