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

Ali*_*rin 17 authentication authorization jwt signalr asp.net-core

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

And*_*nov 8

看一下建议使用查询字符串的文章使用JWT对ASP.NET Core 1.0(vNext)SignalR应用程序进行身份验证.我知道您的令牌太长,但作者解释了如何使用中间件来验证请求.

以下是文章摘要:

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

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

从这个答案中,您可以创建WebSocket连接并将您的令牌作为基本auth参数传递:

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