【发布时间】:2022-01-16 08:08:41
【问题描述】:
我正在尝试向我的 signalR 集线器添加身份验证,但它仅适用于“协商”方法,而不适用于发送到集线器的每个请求。
在Startup.cs下ConfigureService我添加了:
// Authentication
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(options =>
{
options.TokenValidationParameters = GetTokenValidationParameters(authSettings.PublicKey);
options.IncludeErrorDetails = true;
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("/hubs")))
{
context.Token = accessToken;
}
return Task.CompletedTask;
},
};
});
在我添加的Configure方法中:
app.UseWhen(ctx => ctx.Request.Path.StartsWithSegments("/hubs"), config => config.UseAuthentication());
并在 hub 类上添加了[Authorize] 属性:
[Authorize]
public class ProtocolMethodsHub : Hub<IProtocolMethodsHub>, IProtocolMethodsHub {}
我在OnMessageReceived 中设置了一个断点,但它仅在连接到 signalR 时调用,而不是针对通过 websocket 发送的每个请求。
有没有办法对中心的每个请求进行身份验证/授权?
【问题讨论】:
标签: asp.net-core jwt signalr-hub