当使用Blazor、SignalR Core和Microsoft Identity Platform进行身份验证时,在Hub端似乎无法进行身份验证。
在SignalR连接中添加Authorization头,并在服务器端令牌验证中启用SignalR。具体代码示例如下:
客户端代码:
var connection = new HubConnectionBuilder() .WithUrl(NavigationManager.ToAbsoluteUri("/hubs/chat"), options => { options.AccessTokenProvider = async () => { var tokenResult = await authService.GetAccessTokenAsync(); return tokenResult.AccessToken; }; }) .Build();
服务器端代码:
services.AddSignalR() .AddJwtBearer(options => { options.Events = new JwtBearerEvents { OnMessageReceived = context => { var accessToken = context.Request.Query["access_token"]; var hubPath = context.HttpContext.Request.Path;
if (!string.IsNullOrEmpty(accessToken) &&
(hubPath.StartsWithSegments("/chatHub")))
{
context.Token = accessToken;
}
return Task.CompletedTask;
}
};
});
其中,AccessTokenProvider可以根据需要替换为自己的身份验证方法。在服务器端的令牌验证中,OnMessageReceived事件用于获取SignalR连接中的access_token并设置到当前上下文中。
注意:此方法仅适用于基于令牌的身份验证。如果您使用其他身份验证方式,则需要根据实际情况进行调整。