【问题标题】:JWT authentication in SignalR (.NET Core) without passing token in Query StringSignalR (.NET Core) 中的 JWT 身份验证,无需在查询字符串中传递令牌
【发布时间】:2017-05-02 18:26:20
【问题描述】:

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

【问题讨论】:

  • 这不是重复的,因为我根本无法使用查询字符串,我的令牌太长并且出现 414 错误。我想构建一个自定义中间件之类的东西,它从 SignalR 消息中提取令牌,然后让用户登录。
  • 不幸的是,只有两种传递令牌的方法——查询字符串或作为参数。希望这将在下一版本的 SignalR 中得到解决。
  • 可能是标头值?
  • MS提供的SignalR JS库不支持设置headers

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


【解决方案1】:

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

这是文章的摘要:

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

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

从此answer,您可以创建一个 WebSocket 连接并将您的令牌作为基本身份验证参数传递:

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

【讨论】:

  • 中间件有,只是qs太长了
  • 我知道你的qs很长。你可以将令牌嵌入到payload中并使用中间件解码你之前注册它吗?
  • 好吧,我想你可能无法在 SignalR 之前访问中间件中的有效负载。在这种情况下,您可以在读取有效负载时在应用程序代码中为令牌实现自定义解析器。您将无法使用 Authorize 属性,但您将能够检查用户的声明等。
  • 暂时使用丑陋的 hack 修复它,压缩令牌并缩短声明名称
  • 还可以查看这个答案,了解基本身份验证stackoverflow.com/a/41521871/2138959 的黑客攻击。您仍然需要实现自定义中间件,但令牌可以通过标头传递。哪个查询字符串更安全。
猜你喜欢
  • 2016-12-25
  • 2021-12-17
  • 2019-02-22
  • 2014-02-17
  • 2018-12-13
  • 1970-01-01
  • 2014-07-15
  • 2020-06-12
  • 1970-01-01
相关资源
最近更新 更多