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

Blazor WebAssembly中AuthenticationState的Identity为空无法获取用户信息

问题排查及解决方案

1. 服务端Identity未配置返回必要Claims

默认Microsoft Identity + IdentityServer 配置下,不会自动将name、role等用户Claims包含在返回给前端的ID令牌中,需要在服务端手动配置:

// 服务端Program.cs
builder.Services.AddIdentityServer()
    .AddApiAuthorization<ApplicationUser, ApplicationDbContext>(options =>
    {
        // 添加name claim到身份资源和API资源
        options.IdentityResources["openid"].UserClaims.Add("name");
        options.ApiResources.Single().UserClaims.Add("name");
        // 如需角色等其他Claims同理添加
        options.IdentityResources["openid"].UserClaims.Add("role");
        options.ApiResources.Single().UserClaims.Add("role");
    });
// 移除role claim的默认入站映射,避免类型名被改写
JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Remove("role");

2. 前端授权服务注册顺序错误

你当前代码中AddApiAuthorization()的注册位置在带授权处理器的HttpClient配置之后,授权服务未提前初始化会导致Claims解析异常,需要调整顺序:将builder.Services.AddApiAuthorization();移动到所有依赖授权服务的配置(比如AddHttpClient加BaseAddressAuthorizationMessageHandler、OData服务注册)之前。

3. JWT Claims默认映射导致Name属性读取失败

.NET默认的JWT处理器会将标准name Claim映射为XML格式的自定义Claim类型,导致User.Identity.Name无法读取到值,在前端AddApiAuthorization()之前添加以下代码禁用默认映射:

// 前端Program.cs,放在AddApiAuthorization之前
JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();

4. 附加已知问题

你当前注册的HttpClient名称不一致:首次注册的命名客户端名称为ServerAPI,后续创建实例时调用的名称为Morf.ServerAPI,名称不匹配会导致调用服务端API时无法正确携带访问令牌,需统一两个名称。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 11:57:03