0

我的目标是:使用自定义标头和我自己的令牌来针对我的信号器服务对用户或机器进行身份验证。

我们一直在 ASP.net WEB API 下成功地使用这种方法来执行我们自己的基于自定义声明的身份验证和授权。

我们的 Web Api 如下:

protected void Application_Start()
{
        GlobalConfiguration.Configuration.MessageHandlers.Add(new AuthorizationHeaderHandler());

}

然后我们会有一个 AuthorizationHandler 覆盖 Thread.CurrentPrincipal = principal; 我们就完成了。

在 SignalR 中,我尝试实现: 1. 使用 Authorize 标记我们的集线器 2. 实施自定义授权属性 3. 尝试自定义模块。但是,如果我们发送正确的标头,除了返回 true 之外,我仍然没有让 Context.User 更改为我们生成的基于声明的主体。

但是我们永远无法让 Context.User 显示用于连接到集线器的实际用户。

欢迎任何建议。

我们想要实现这一点的主要原因是因为我们有几个不同的用户/机器类型连接到我们的系统。

大家有什么建议。

4

1 回答 1

2

终于找到了解决办法。

我添加了自己的 owin 安全中间件,允许我处理基于客户标头的身份验证。

这可以很容易地扩展,允许您在服务中组合多个身份验证方案。

首先创建自定义认证中间件:

public class AuthenticationMiddleware : OwinMiddleware
{
    public AuthenticationMiddleware(OwinMiddleware next) :
        base(next) { }


    public override async Task Invoke(IOwinContext context)
    {
        var request = context.Request;
        var value = request.Headers["Phocabby-MachineKey"];
        var username = value;
        var usernameClaim = new Claim(ClaimTypes.Name, username);
        var identity = new ClaimsIdentity(new[] { usernameClaim }, "ApiKey");
        var principal = new ClaimsPrincipal(identity);
        principal.Identities.First().AddClaim(new Claim("CanGetApiKey", "False"));
        principal.Identities.First().AddClaim(new Claim("Cabinet", "True"));
        request.User = principal;
        await Next.Invoke(context);
    }
}

然后在启动类中注册

public void Configuration(IAppBuilder app)
{
    app.Use(typeof(AuthenticationMiddleware));
    app.MapSignalR();
}
于 2014-03-15T16:56:50.300 回答