2013-12-18 60 views
7

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

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

回答

0

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

在我的情况。我刚刚创建了一个从Hub类继承的抽象类,然后在那里填充了我的oauth声明生成逻辑。然后我的常规混凝土中心继承我的基地自定义中心类。

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

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

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.. 
    } 
0

我发现,当您从Web API中调用默认/令牌处理程序(例如JQuery)时,浏览器还会发送一个Cookie,用于使用SignalR对您进行身份验证。

您应该能够使用[Authorize]属性以及SignalR中心方法中的“Context.User.Identity”来获取当前用户,只要您使用来自浏览器连接到集线器之前。