使用 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 身份验证的主要内容,如果未能解决你的问题,请参考以下文章