Blazor中使用Identity获取用户名为何返回真实姓名而非用户ID?
问题原因解析
这其实是ASP.NET Core Identity中声明(Claim)的默认映射规则导致的,完全符合框架的设计逻辑,和你用的.NET 5预览版没有关系~
核心原因
@context.User.Identity.Name这个属性,底层是从用户的Claims集合里读取**类型为ClaimTypes.Name**的声明值,而ClaimTypes.Name对应的字符串常量就是"name"——你在注册时添加的声明正好用了这个类型:
await _userManager.AddClaimAsync(user, new System.Security.Claims.Claim("name", user.Name));
所以框架自动把这个真实姓名的声明值,当成了Identity.Name的返回内容。
额外说明
- 如果你想获取原来的用户ID(比如用户名/注册邮箱),应该读取类型为
ClaimTypes.NameIdentifier的声明,代码示例:var userId = @context.User.FindFirstValue(System.Security.Claims.ClaimTypes.NameIdentifier); - 关于你之前修改Identity架构添加的用户字段,其实还有更直接的方式在Blazor组件中获取:注入
UserManager<ApplicationUser>,然后通过GetUserAsync方法获取完整的用户实体,直接访问实体属性:
这样你就能直接用@inject UserManager<ApplicationUser> _userManager @code { private ApplicationUser currentUser; protected override async Task OnInitializedAsync() { currentUser = await _userManager.GetUserAsync(User); } }currentUser.Name、currentUser.Email等所有自定义字段,不用依赖声明映射。
内容的提问来源于stack exchange,提问作者user3656651
相关产品推荐
相关产品推荐

