SignalR(.NET Core)中的JWT身份验证,不在Query String中传递令牌

时间:2016-12-16 22:13:15

标签: authentication asp.net-core authorization signalr jwt

我在ASP .NET Core Web API应用程序中使用JWT身份验证令牌。令牌由API本身生成,而不是由第三方生成。 我成功地将SignalR添加到堆栈中,但现在我需要对尝试执行服务器(Hub)方法的用户进行身份验证。 有人建议在JavaScript中的“qs”属性中传递令牌。这将对我不起作用,因为我们的代币非常大(它们包含大量索赔)。 我尝试编写一个自定义中间件,用于从有效负载中读取令牌并自动验证用户。问题是,使用WebSockets时,不会执行中间件。 任何想法都会有所帮助。

1 个答案:

答案 0 :(得分:8)

查看建议使用查询字符串Authenticate against a ASP.NET Core 1.0 (vNext) SignalR application using JWT的文章。我知道您的令牌太长,但作者解释了如何使用中间件来验证请求。

以下是文章摘要:

  
      
  • SignalR没有内置任何特殊的身份验证机制,它使用标准的ASP.NET身份验证。
  •   
  • JWT通常在请求的授权标头中发送
  •   
  • SignalR JavaScript客户端库不包含在请求中发送标头的方法,但它允许您传递查询字符串
  •   
  • 如果我们在查询字符串中传递令牌,我们可以编写一个中间件,添加一个带有令牌作为其值的授权头。 这必须在管道中的Jwt中间件之前完成
  •   
  • 请注意“承载”格式
  •   

我已经强调了在Jwt中间件之前应该注册自定义中间件的关键点。

从这个answer你可以创建一个WebSocket连接并将你的令牌作为基本的auth参数传递:

var ws = new WebSocket($"ws://{token}@example.com/service");