在SignalR集线器中获取JWT令牌

时间:2018-01-06 06:36:07

标签: signalr signalr-hub asp.net-core-signalr

我有两个要求:

  1. 我希望我的SignalR个中心需要身份验证
  2. 当请求进来时,我希望它带有JWT token 我可以获得用户数据。
  3. 重要的是要注意我使用的SignalR Core仍然使用Alpha,看起来API已经发生了一些变化。

    过去几个小时我一直在研究这个问题,我对如何在客户端传递JWT Token并在服务器端接收它感到困惑。

1 个答案:

答案 0 :(得分:0)

当您连接到集线器时,可以将jwt作为查询字符串参数传递,然后将令牌添加为中间件中的标头。这是一个非常基本的例子。

JS

let connection = new signalR.HubConnection('http://localhost/messagesHub', {jwtBearer: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ'});

connection.on('Send', data => {
    console.log(data);
});

connection.start()
          .then(() => connection.invoke('Send', 'test'));

添加到您的Startup.cs尽可能高地配置顶部附近的{}

app.Use(async (context, next) =>
{
    if (context.Request.Query.TryGetValue("token", out var token))
    {
        context.Request.Headers.Add("Authorization", $"Bearer {token}");
    }
    await next.Invoke();
});

由于令牌已添加到中间件的标头中,因此它应该像普通的JWT auth一样使用与在任何其他应用程序中使用的配置相同的配置。

请注意,您正在查询字符串中传递JWT,因此请注意不同的安全问题并进行更改以帮助对抗它们(如https)