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

ASP.NET Core MVC集成WSO2认证后如何从JWT中获取登录用户名

解决方法

1. 控制器内直接获取(最简单方案)

所有标注了[Authorize]特性的控制器/Action,都可以直接访问控制器基类自带的User属性(ClaimsPrincipal类型),直接读取用户名:

// 直接读取默认配置下的用户名
var userName = User.Identity?.Name;

2. 读取结果为空的处理方案

如果上述代码返回空值,是因为WSO2返回的JWT令牌中,存储用户名的声明类型和ASP.NET Core默认使用的ClaimTypes.Name不匹配,按以下步骤处理:

第一步:调试找到用户名对应的声明类型

先输出当前用户所有声明,找到WSO2返回的存储用户名的键:

foreach (var claim in User.Claims)
{
    // 输出所有声明的类型和值,找到存储用户名的声明类型,常见为preferred_username、sub等
    Console.WriteLine($"类型:{claim.Type},值:{claim.Value}");
}

第二步:两种方式读取用户名

  • 临时读取:直接指定声明类型取值
// 替换为你实际找到的用户名声明类型即可
var userName = User.FindFirstValue("preferred_username");
  • 全局配置:修改Startup.cs的JWT配置,一劳永逸让User.Identity.Name直接返回用户名
    在TokenValidationParameters配置中新增NameClaimType配置:
.AddJwtBearer(options =>
{
    options.TokenValidationParameters = new TokenValidationParameters
    {
        ValidateIssuer = true,
        ValidateAudience = true,
        ValidateLifetime = true,
        ValidateIssuerSigningKey = true,
        ValidIssuer = Configuration["Jwt:Issuer"],
        ValidAudience = Configuration["Jwt:Issuer"],
        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Jwt:Key"])),
        // 新增该行,替换为你实际找到的用户名声明类型
        NameClaimType = "preferred_username"
    };
});

配置完成后就可以直接用User.Identity?.Name读取用户名。

3. 视图中读取用户名

如果需要在Razor视图中显示用户名,直接用如下代码即可:

@User.Identity?.Name

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 08:15:04