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

