【问题标题】:Authorization Header in SignalR 2.0SignalR 2.0 中的授权标头
【发布时间】:2014-01-06 06:07:10
【问题描述】:
我正在为我的 api 控制器使用 WebApi 和基于令牌的身份验证。(Authorization :bearer xyzabc..)我现在有一个 signalR 集线器,并希望使用客户端在客户端拥有的相同令牌对客户端进行身份验证。
我该怎么做?这个link 展示了如何通过 url 参数发送令牌,但我不确定如何使用该令牌并在服务器端对用户进行身份验证。
【问题讨论】:
标签:
authentication
asp.net-web-api
signalr
【解决方案1】:
我通过将令牌作为 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..
}
【解决方案2】:
我不会每次都发送令牌。我会在 OnConnected 虚拟方法上建立您的上下文用户主体,并从从令牌传递的查询字符串中读取。
就我而言。我刚刚创建了一个继承自 Hub 类的抽象类,然后在其中填充了我的 oauth 声明生成逻辑。然后我的常规混凝土集线器只是从我的基本自定义集线器类继承而来。
另一种选择是使用自定义授权属性或其他集线器管道模块。
我认为这些策略可能会使您的代码保持干燥和可扩展。
【解决方案3】:
我发现,当您从 JQuery 之类的 Web API 中调用默认的 /Token 处理程序时,浏览器也会收到一个 cookie,用于通过 SignalR 对您进行身份验证。
您应该能够在 SignalR 集线器方法中使用 [Authorize] 属性以及“Context.User.Identity”来获取当前用户,只要您使用来自浏览器的有效凭据调用 /Token在连接到集线器之前。