Blazor WASM+API项目:如何重写User.Identity.Name返回preferred_username
解决方案:让API中User.Identity.Name返回preferred_username
针对你的需求,有几种更优的方案可以替代手动遍历Claims获取preferred_username,以下是具体实现:
方案1:修改认证中间件的NameClaimType
在API的Program.cs中配置JWT认证时,直接指定NameClaimType为"preferred_username",这样User.Identity.Name会自动读取该声明的值:
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { // 保留你的其他验证配置(如ValidAudience、ValidIssuer等) NameClaimType = "preferred_username" // 将Name的来源指定为preferred_username }; });
配置完成后,无需修改业务代码,直接使用var username = User.Identity.Name;就能获取到登录账号。
方案2:使用ClaimsTransformation统一转换声明
如果需要更灵活的逻辑(比如处理preferred_username不存在的 fallback 场景),可以通过IClaimsTransformation扩展声明转换:
// 在Program.cs中注册服务 builder.Services.AddTransient<IClaimsTransformation, CustomClaimsTransformation>(); // 自定义转换类 public class CustomClaimsTransformation : IClaimsTransformation { public Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal) { var identity = principal.Identity as ClaimsIdentity; if (identity == null) return Task.FromResult(principal); var preferredUsername = identity.FindFirstValue("preferred_username"); if (!string.IsNullOrEmpty(preferredUsername)) { // 移除原Name声明(若存在) var existingName = identity.FindFirst(identity.NameClaimType); if (existingName != null) identity.RemoveClaim(existingName); // 新增Name声明,值为preferred_username identity.AddClaim(new Claim(identity.NameClaimType, preferredUsername)); } return Task.FromResult(principal); } }
这种方式会在每个请求的认证流程中自动处理声明,全局生效。
方案3:扩展方法简化查询
如果不想修改全局认证逻辑,也可以写一个扩展方法简化preferred_username的获取:
public static class ClaimsPrincipalExtensions { public static string GetLoginUsername(this ClaimsPrincipal user) { // 优先取preferred_username,不存在则 fallback 到原有Name return user.FindFirstValue("preferred_username") ?? user.Identity?.Name ?? string.Empty; } }
使用时直接调用:var username = User.GetLoginUsername();,代码更简洁且可读性更高。
内容的提问来源于stack exchange,提问作者Dorian
相关产品推荐
相关产品推荐

