我正在为我的api控制器使用基于WebApi和令牌的身份验证。(授权:bearer xyzabc ..)我现在有一个signalR集线器,并希望通过客户端上的相同令牌对客户端进行身份验证。
我该怎么做?这个link显示了如何通过url参数发送令牌,但我不确定如何使用该令牌并在服务器端验证用户。
答案 0 :(得分:2)
我通过将令牌作为我的Hub方法的参数而不是标头来解决这个问题。但我想也可以使用标题来做它(只是从Context.Headers或其他东西中提取令牌)。
无论哪种方式,在hub方法中获取令牌后,只需使用此代码即可。
public Task SendMessage(string message, string token)
{
var ticket = Startup.OAuthOptions.AccessTokenFormat.Unprotect(token);
bool isAuth = ticket.Identity.IsAuthenticated;
//You can retrieve other details like username and userid from ticket
...rest of your code..
}
答案 1 :(得分:0)
我不会每次都发送令牌。我将在OnConnected虚拟方法上建立您的上下文用户主体,并从标记传递的查询字符串中读取。
就我而言。我刚刚创建了一个从Hub类继承的抽象类,然后在那里填充了我的oauth声明生成逻辑。然后我的常规混凝土集线器继承自我的基础自定义集线器类。
另一种选择是使用自定义授权属性或其他集线器管道模块。
我认为这些策略可能会使您的代码保持干燥和可扩展。
答案 2 :(得分:0)
我发现当你从Web API调用JQuery之类的默认/ Token处理程序时,浏览器也会发送一个cookie,用于通过SignalR验证你。
只要您使用浏览器中的有效凭据调用/ Token,您就应该能够使用SignalR集线器方法中的[Authorize]属性以及“Context.User.Identity”来获取当前用户在连接到集线器之前。