使用 Blazor wasm Bearer Token 进行 SignalR 身份验证

Posted

技术标签:

【中文标题】使用 Blazor wasm Bearer Token 进行 SignalR 身份验证【英文标题】:SignalR authentication with Blazor wasm Bearer Token 【发布时间】:2021-05-09 01:24:22 【问题描述】:

我使用 Bearer 令牌向 Signalr 进行了身份验证,并且 Signalr 说身份验证是 成功。

但 Signalr Hub Context.Identity.User.Name 在身份验证后为空。

如何在 SignalR Hub 中访问经过身份验证的用户信息以进行连接 ID 和用户映射。

我的 Startup.cs 代码用于身份验证。

 services.AddAuthentication(options =>
                    
                        options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                        options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
                    ).AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, options =>
                    
                        options.Authority = "https://security.minima.local";
                        options.Audience = "blazor_web_app_api";
                        options.RequireHttpsMetadata = false;
    
                        options.TokenValidationParameters = new
                            TokenValidationParameters()
                            
                                ValidateAudience = false
                            ;
                        options.Events = new JwtBearerEvents
                        
                            OnMessageReceived = context =>
                            
                                var accessToken = context.Request.Query["access_token"];
                                var path = context.HttpContext.Request.Path;
                                if (!string.IsNullOrEmpty(accessToken) &&
                                    (path.StartsWithSegments("/notification")))
                                
                                    context.Token = accessToken;
                                
    
                                return Task.CompletedTask;
                            
                        ;
                    )
                    .AddIdentityServerJwt();

【问题讨论】:

您知道您的令牌包含Name 声明吗?此外,默认情况下,SignalR 对用户使用 NameIdentifier 声明,但您可以自定义 docs.microsoft.com/aspnet/core/signalr/… 事实上所有声明都是空的(电子邮件等),但只有 NameIdentifier 不是空的。我如何使用 NameIdentifier 提出其他声明? 【参考方案1】:

您需要告诉 TokenValidator 哪个声明是名称和角色声明,您可以通过设置:

.AddMyJwtBearer(opt =>
    
        ...
        opt.TokenValidationParameters.RoleClaimType = "roles";
        opt.TokenValidationParameters.NameClaimType = "name";

【讨论】:

以上是关于使用 Blazor wasm Bearer Token 进行 SignalR 身份验证的主要内容,如果未能解决你的问题,请参考以下文章

Blazor_WASM之3:项目结构

Blazor Wasm 身份登录/注销事件

Blazor WASM 视图模型

具有 ReportViewer 导出功能的 Blazor (Wasm)

Blazor 客户端 (WASM) 应用程序洞察

Blazor Wasm 身份验证