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

Signal R身份验证中Context详情始终为空的问题求助

问题原因及修复步骤

1. 调整中间件执行顺序

当前BlazorCookieLoginMiddleware放在认证中间件之前,可能干扰SignalR连接的认证上下文初始化。将自定义中间件移至认证与授权中间件之后,确保SignalR请求先完成认证流程:

app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseMiddleware<BlazorCookieLoginMiddleware>(); // 移至此处
app.UseAntiforgery();

2. 客户端启用凭证发送

客户端建立SignalR连接时,需显式配置发送认证Cookie,否则服务器无法获取用户身份:

hubConnection = new HubConnectionBuilder()
    .WithUrl(UriHelper.ToAbsoluteUri("/itemaccesshub"), options =>
    {
        options.WithCredentials = true; // 启用Cookie凭证发送
    })
    .Build();

3. 确保Identity用户Claims包含Email信息

检查ApplicationUser的Claim映射,确保Email被正确添加到用户身份中。可通过注册默认或自定义Claims工厂实现:

// 注册默认Claims工厂
builder.Services.AddIdentityCore<ApplicationUser>(options =>
{
    // 你的密码/登录配置
})
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddSignInManager()
.AddDefaultTokenProviders()
.AddClaimsPrincipalFactory<UserClaimsPrincipalFactory<ApplicationUser>>();

若需自定义Claim,可创建专属工厂:

public class CustomUserClaimsPrincipalFactory : UserClaimsPrincipalFactory<ApplicationUser>
{
    public CustomUserClaimsPrincipalFactory(UserManager<ApplicationUser> userManager, IOptions<IdentityOptions> optionsAccessor)
        : base(userManager, optionsAccessor)
    {
    }

    protected override async Task<ClaimsIdentity> GenerateClaimsAsync(ApplicationUser user)
    {
        var identity = await base.GenerateClaimsAsync(user);
        identity.AddClaim(new Claim(ClaimTypes.Email, user.Email));
        return identity;
    }
}

// 在Program.cs中注册
builder.Services.AddScoped<IUserClaimsPrincipalFactory<ApplicationUser>, CustomUserClaimsPrincipalFactory>();

4. 验证Hub授权拦截未认证连接

在ItemAccessHub中添加日志排查未认证请求,确保[Authorize]属性生效:

public override Task OnConnectedAsync()
{
    if (Context.User == null)
    {
        // 记录未认证连接日志
        return Task.FromException(new UnauthorizedAccessException("用户未完成认证"));
    }
    // 原有逻辑
    return base.OnConnectedAsync();
}

5. 检查Cookie的SameSite配置

若为本地开发或跨域场景,调整Cookie的SameSite属性避免被浏览器拦截:

builder.Services.ConfigureApplicationCookie(options =>
{
    // 原有配置
    options.Cookie.SameSite = SameSiteMode.Lax;
    options.Cookie.SecurePolicy = CookieSecurePolicy.Always; // 生产环境启用
});

额外排查点

  • 查看浏览器Network面板,确认SignalR协商请求是否携带认证Cookie
  • 检查服务器日志,验证认证中间件是否正确处理SignalR请求
  • 确认用户已成功登录,且浏览器中认证Cookie处于有效状态

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 11:39:52