Blazor应用中JWT声明类型自动添加URL问题求助
解决方案建议
API端直接使用标准声明类型
生成JWT Token时,不要用自定义的短名称(比如"name"),而是直接引用System.Security.Claims.ClaimTypes里的标准字段,这样客户端解析时就不会自动补全URL前缀。示例代码:var claims = new List<Claim> { new Claim(ClaimTypes.Name, "your_username"), new Claim(ClaimTypes.Role, "Admin") };如果要用自定义声明,确保API生成时就使用不带URL的自定义键,避免后续自动映射。
在CustomAuthStateProvider里手动处理声明类型
解析Token后遍历Claims集合,把带URL前缀的声明类型替换成短名称。示例代码:private async Task<AuthenticationState> GetAuthenticationStateAsync() { var token = await _localStorage.GetItemAsync<string>("authToken"); if (string.IsNullOrEmpty(token)) { return new AuthenticationState(new ClaimsPrincipal()); } var handler = new JwtSecurityTokenHandler(); var jwtToken = handler.ReadJwtToken(token); // 移除默认的URL前缀 var cleanedClaims = jwtToken.Claims.Select(c => new Claim( c.Type.Replace("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/", ""), c.Value ) ).ToList(); var identity = new ClaimsIdentity(cleanedClaims, "jwt"); return new AuthenticationState(new ClaimsPrincipal(identity)); }关闭JWT解析器的默认声明映射
在Blazor项目的Program.cs里,清空JWT处理程序的默认入站声明映射,彻底禁用自动添加URL的行为:// 清空默认声明映射 JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear(); builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidateAudience = true, // 其他Token验证配置... }; });
内容的提问来源于stack exchange,提问作者Stefan Mostert
相关产品推荐
相关产品推荐

