首页 文章

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

提问于
浏览
17

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

1 回答

  • 8

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

    以下是文章摘要:

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

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

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

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

相关问题