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..
}
3 回答
我不会每次都发送令牌 . 我将在OnConnected虚拟方法上 Build 您的上下文用户主体,并从标记传递的查询字符串中读取 .
就我而言 . 我刚刚创建了一个从Hub类继承的抽象类,然后在那里填充了我的oauth声明生成逻辑 . 然后我的常规混凝土集线器继承自我的基本自定义集线器类 .
另一种选择是使用自定义授权属性或其他集线器管道模块 .
我认为这些策略可能会使您的代码保持干燥和可扩展性 .
我通过将令牌作为我的Hub方法的参数而不是标头来解决这个问题 . 但我想也可以使用 Headers 来做它(只是从Context.Headers或其他东西中提取令牌) .
无论哪种方式,在您的集线器方法中获取令牌后,只需使用此代码 .
我发现当你从Web API调用JQuery之类的默认/ Token处理程序时,浏览器也会发送一个cookie,用于通过SignalR对你进行身份验证 .
你应该能够使用[Authorize]属性以及SignalR hub方法中的“Context.User.Identity”来获取当前用户,只要你在连接之前使用浏览器中的有效凭据调用/ Token枢纽 .