使用参考令牌的 ASPNETCore SignalR 身份验证

Posted

技术标签:

【中文标题】使用参考令牌的 ASPNETCore SignalR 身份验证【英文标题】:ASPNETCore SignalR authentication with Reference token 【发布时间】:2020-03-31 07:15:57 【问题描述】:

我们在 Web API (netcoreapp2.2) 中使用 ASPNETCore.SignalR 1.1.0。

身份验证:我们正在为我们的项目使用 IdentityServer4 身份验证。

启动.cs

 services.AddAuthentication("Bearer")
           .AddIdentityServerAuthentication(options =>
           
               options.Authority = "http://IdentityServerDomainURL:8081/";
               options.RequireHttpsMetadata = false;

               options.ApiName = "name";
               options.ApiSecret = "secret";                

           );

在 WebAPI 应用程序中,我们添加了 SignalR Hub。 javascript 客户端连接到此集线器。 以下是JS客户端连接hub的代码。

var connection = new signalR.HubConnectionBuilder()
                    .withUrl("http://localhost:52177/SignalRHub/", 
                    
                     accessTokenFactory: () => "referencetokenValue"
                    ).build();

JS 客户端在连接到 Hub 时正在传递引用令牌。 我们需要在 WebAPI 项目中对 SignalR 使用 Reference token 认证。

在 Microsoft 的站点中,仅提供了 SignalR 的 JWT 令牌身份验证文档。在任何地方都没有找到任何关于参考令牌的文档。

需要帮助在 startup.cs 文件中添加参考令牌身份验证配置。

【问题讨论】:

您可以参考this document 并尝试使其支持引用令牌。 @FeiHan 谢谢你的回复。这个文件我看过。问题是信号器 JS 客户端在查询字符串中传递引用令牌。预期的行为是令牌应该出现在 Header 中。 Microsoft 已使用 JWT 令牌 link 提供了针对此问题的解决方案。但没有提供任何参考令牌的解决方案。 【参考方案1】:

找到解决方案here。

查询字符串中的任何标记都可以添加到请求标头中,如下所示:-

app.Use(async (context, next) =>
        
            if (context.Request.Path.Value.StartsWith("/SignalRHub/"))
            
                var bearerToken = context.Request.Query["access_token"].ToString();

                if (!String.IsNullOrEmpty(bearerToken))
                    context.Request.Headers.Add("Authorization", new string[]  "bearer " + bearerToken );
            

            await next();
        );

以上代码必须在启动类的配置函数中添加。

【讨论】:

以上是关于使用参考令牌的 ASPNETCore SignalR 身份验证的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# AspNetCore 网站中使用 JWT JSON Web 令牌?

“AADSTS5002730:无效的 JWT 令牌。 Azure Signal R 服务令牌的代表方案中出现“签名算法的密钥不受支持”错误

AspNetCore 2.1 Bearer Token Authentication - 当前用户为空

直接从令牌获取 JWT 声明,ASP Net Core 2.1

手把手教你AspNetCore WebApi:认证与授权

如何使用带有 OpenId Connect 的刷新令牌在 asp.net 核心中处理过期的访问令牌