Server
MVC 5 WebApi 2 内的 SignalR 集线器,
安全性:不记名令牌
Client
使用 HttpWebRequest 从 WebApi 控制器/Token 端点检索承载令牌的 C# 类
我使用了所描述的模式here https://stackoverflow.com/questions/23867640/signalr-authentication-failed-when-passing-bearer-through-query-string and here http://geekswithblogs.net/shaunxu/archive/2014/05/27.aspx将不记名令牌传递给我的 AuthorizeAttribute 子类。
当 AuthorizeHubConnection 方法中的代码执行通过调用“secureDataFormat.Unprotect(token)”传递的票证时,该票证始终为 null。我已确认通信两端的令牌是相同的。
这是覆盖方法:
public override bool AuthorizeHubConnection(AspNet.SignalR.Hubs.HubDescriptor hubDescriptor, IRequest request)
{
var dataProtectionProvider = new DpapiDataProtectionProvider();
var secureDataFormat = new TicketDataFormat(dataProtectionProvider.Create());
var token = request.QueryString.Get("Bearer");
var ticket = secureDataFormat.Unprotect(token);
if (ticket != null && ticket.Identity != null && ticket.Identity.IsAuthenticated)
{
// set the authenticated user principal into environment so that it can be used in the future
request.Environment["server.User"] = new ClaimsPrincipal(ticket.Identity);
return true;
}
return false;
}
当我在没有授权属性的情况下运行集线器并在“OnConnected”覆盖中设置断点时,Context.User 属性也为空。
任何帮助将不胜感激。
Rich
终于弄清楚了,我使用了错误的库来解密令牌。 DpapiDataProtectionProvider 用于自托管场景,我们托管在 IIS 中。这是功能代码。
public override bool AuthorizeHubConnection(Microsoft.AspNet.SignalR.Hubs.HubDescriptor hubDescriptor, IRequest request)
{
var token = request.QueryString.Get("Bearer");
var ticket = Startup.OAuthOptions.AccessTokenFormat.Unprotect(token);
if (ticket != null && ticket.Identity != null && ticket.Identity.IsAuthenticated)
{
// set the authenticated user principal into environment so that it can be used in the future
request.Environment["server.User"] = new ClaimsPrincipal(ticket.Identity);
return true;
}
return false;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)