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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 09:55:22