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
相关产品推荐
相关产品推荐

