ASP.NET Core 9 MVC中通过Identity在_Layout页显示用户名而非邮箱
解决ASP.NET Core 9 MVC Identity显示用户名而非邮箱的问题
方法1:修改用户注册时的Claims(推荐)
默认情况下Identity会把邮箱映射到ClaimTypes.Name,导致@User.Identity!.Name返回邮箱。你可以在用户注册逻辑里手动替换这个Claim为用户名:
在注册页面的OnPostAsync方法中:
var user = new ApplicationUser { UserName = Input.UserName, Email = Input.Email }; var result = await _userManager.CreateAsync(user, Input.Password); if (result.Succeeded) { // 移除默认的邮箱Name Claim var existingNameClaim = await _userManager.GetClaimAsync(user, ClaimTypes.Name); if (existingNameClaim != null) { await _userManager.RemoveClaimAsync(user, existingNameClaim); } // 添加用户名为Name Claim await _userManager.AddClaimAsync(user, new Claim(ClaimTypes.Name, user.UserName)); // 后续登录逻辑... }
修改后,@User.Identity!.Name会直接返回用户名。
方法2:在视图中直接通过UserManager获取用户名
如果不想修改Claim逻辑,可以在_Layout页面注入UserManager直接查询用户名:
首先在_Layout.cshtml顶部注入服务:
@inject UserManager<ApplicationUser> UserManager
然后在需要显示用户名的位置:
@if (User.Identity.IsAuthenticated) { var currentUser = await UserManager.GetUserAsync(User); <span>@currentUser.UserName</span> }
注意:这种方式每次渲染视图都会查询数据库,适合小流量站点使用。
方法3:自定义UserClaimsPrincipalFactory(全局统一配置)
如果需要全局统一设置Claim映射规则,自定义工厂类是更优雅的方案:
- 创建自定义工厂类:
public class CustomUserClaimsFactory : UserClaimsPrincipalFactory<ApplicationUser> { public CustomUserClaimsFactory(UserManager<ApplicationUser> userManager, IOptions<IdentityOptions> options) : base(userManager, options) { } protected override async Task<ClaimsIdentity> GenerateClaimsAsync(ApplicationUser user) { var identity = await base.GenerateClaimsAsync(user); // 替换Name Claim为用户名 identity.RemoveClaim(identity.FindFirst(ClaimTypes.Name)); identity.AddClaim(new Claim(ClaimTypes.Name, user.UserName)); return identity; } }
- 在Program.cs中注册这个工厂:
builder.Services.AddScoped<IUserClaimsPrincipalFactory<ApplicationUser>, CustomUserClaimsFactory>();
配置完成后,所有生成的用户Claims中,Name都会对应用户名,@User.Identity!.Name即可直接使用。
内容的提问来源于stack exchange,提问作者INVENTUS T.V
相关产品推荐
相关产品推荐

