You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Blazor Server(.NET7)中SignalR Hub无法获取已认证用户身份的问题

Blazor Server(.NET7)SignalR Hub无法获取已登录用户身份的问题

我在Blazor Server(.NET7)应用的SignalR Hub的OnConnectedAsync方法中,发现Context.User.Identity.Name为null,且Context.User.Identity.IsAuthenticated为false。根据MSDN文档说明:SignalR可与ASP.NET Core身份认证结合,将用户与每个连接关联;在浏览器应用中,Cookie认证会自动将现有用户凭据传递给SignalR连接,无需额外配置,登录用户的SignalR连接应自动继承身份认证。

本项目基于微软Blazor聊天示例开发,用户已通过Blazor应用的标准身份认证表单(基于.NET Membership独立账户,数据库存储用户名和密码)完成登录,进入聊天页面后点击“Chat”按钮时会自动将用户名发送至Chat Hub。我希望直接从SignalR Hub填充在线用户列表,但目前无法获取用户身份信息,已查阅MSDN相关文档及进行大量搜索仍未解决,项目代码可访问对应GitHub仓库。

排查建议

  • 核对中间件顺序:必须保证app.UseAuthentication()在app.UseAuthorization()、app.MapBlazorHub()以及app.MapHub<ChatHub>("/chathub")之前配置,中间件顺序错误会直接导致SignalR连接无法获取用户认证信息。
  • 检查Cookie配置:确认Cookie认证的SameSite属性设置,若站点存在跨域场景(包括子域名),需将SameSite设为SameSiteMode.Lax或SameSiteMode.None(需配合HTTPS),防止Cookie无法被SignalR连接携带。
  • 显式配置Hub连接的认证凭据:虽然文档说明自动传递,但可在Blazor中创建HubConnection时显式指定携带凭据:
    var hubConnection = new HubConnectionBuilder()
        .WithUrl(NavigationManager.ToAbsoluteUri("/chathub"), options =>
        {
            options.Credentials = FetchCredentials.Include;
        })
        .Build();
    
  • 确认用户真实登录状态:在Blazor页面中通过@context.User.Identity.IsAuthenticated验证用户是否真的处于登录状态,排除登录逻辑漏洞导致的“假登录”情况。
  • 检查Hub路由的授权设置:确保MapHub的路由没有被错误添加的授权策略拦截,避免身份信息无法正常传递到Hub中。
  • 分析浏览器网络请求:打开浏览器开发者工具,查看SignalR的协商请求(路径为/chathub/negotiate),检查请求头中是否包含认证Cookie。若Cookie未出现,需排查Cookie的路径、域名、过期时间等配置是否正确。

内容的提问来源于stack exchange,提问作者Nicolas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 00:47:17