首页 文章

SignalR 2.0中的授权 Headers

提问于
浏览
7

我正在为我的api控制器使用基于WebApi和令牌的身份验证 . (授权:bearer xyzabc ..)我现在有一个signalR集线器,并希望通过客户端上的相同令牌对客户端进行身份验证 .

我该怎么做?这个link显示了如何通过url参数发送令牌,但我不知道如何使用该令牌并在服务器端验证用户 .

3 回答

  • 0

    我不会每次都发送令牌 . 我将在OnConnected虚拟方法上 Build 您的上下文用户主体,并从标记传递的查询字符串中读取 .

    就我而言 . 我刚刚创建了一个从Hub类继承的抽象类,然后在那里填充了我的oauth声明生成逻辑 . 然后我的常规混凝土集线器继承自我的基本自定义集线器类 .

    另一种选择是使用自定义授权属性或其他集线器管道模块 .

    我认为这些策略可能会使您的代码保持干燥和可扩展性 .

  • 0

    我通过将令牌作为我的Hub方法的参数而不是标头来解决这个问题 . 但我想也可以使用 Headers 来做它(只是从Context.Headers或其他东西中提取令牌) .

    无论哪种方式,在您的集线器方法中获取令牌后,只需使用此代码 .

    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

    我发现当你从Web API调用JQuery之类的默认/ Token处理程序时,浏览器也会发送一个cookie,用于通过SignalR对你进行身份验证 .

    你应该能够使用[Authorize]属性以及SignalR hub方法中的“Context.User.Identity”来获取当前用户,只要你在连接之前使用浏览器中的有效凭据调用/ Token枢纽 .

相关问题