我的目标是: 使用带有我自己的令牌的自定义标头来根据我的信号服务器对用户或机器进行身份验证。
我们一直在ASP.net WEB API下成功使用这种方法来执行我们自己的基于声明的自定义身份验证和授权。
我们的Web Api如下:
protected void Application_Start()
{
GlobalConfiguration.Configuration.MessageHandlers.Add(new AuthorizationHeaderHandler());
}
然后我们会有一个AuthorizationHandler来覆盖Thread.CurrentPrincipal = principal;我们会完成的。
在SignalR中,我试图实现: 1.使用授权标记我们的中心 2.实现自定义授权属性 3.尝试了自定义模块。但除了返回true之外,如果我们发送了正确的头文件,我仍然不会将Context.User更改为我们生成的基于声明的主体。
但我们永远不能让Context.User显示用于连接集线器的实际用户。
欢迎任何建议。
我们想要实现这一目标的主要原因是因为我们有几种不同的用户/机器类型可以连接到我们的系统。
任何人有任何建议。
答案 0 :(得分: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();
}