SignalR Context.User.Identity.Name显示为null(点网6)



我们正在使用webapi的dotnet 6。

我们已经使用了身份验证,并在HttpContext中获取所有用户数据。

仍然,无法在SignalR上下文中设置此数据。

builder.Services.AddSignalR(configure =>
{
configure.MaximumReceiveMessageSize = null;
configure.EnableDetailedErrors = true;
});

===============

app.UseHttpStatusCodeMiddleware();
app.UseCookiePolicy();
app.UseAuthentication();
app.UseRouting();
app.UseAuthorization();
app.UseHttpsRedirection();
app.MapControllers();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
endpoints.MapHub<ChatHub>("/hubs/chat");
});

SignalR连接不同于普通请求,它是由websocket构建的。

SignalR中的单个用户可以与一个应用程序建立多个连接。例如,用户可以在桌面和手机上进行连接。每个设备都有一个单独的SignalR连接,但它们都与同一用户关联。如果向用户发送消息,则与该用户相关联的所有连接都会接收该消息。集线器中的Context.UserIdentifier属性可以访问连接的用户标识符。

默认情况下,SignalR使用与连接关联的ClaimsPrincipal中的ClaimTypes.NameIdentifier作为用户标识符。

因此,如果您想使用用户名,可以尝试使用User.FindFirst(ClaimTypes.NameIdentifier).Value

此外,如果你想修改userid,你应该像这样定制IUserIdProvider,并将其注册为singleton。

public class UserIdProvider : IUserIdProvider
{
public string GetUserId(HubConnectionContext connection)
{
return connection.User.FindFirst(ClaimConstants.PreferredUserName).Value;
}
}

最新更新