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

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映射规则,自定义工厂类是更优雅的方案:

  1. 创建自定义工厂类:
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;
    }
}
  1. 在Program.cs中注册这个工厂:
builder.Services.AddScoped<IUserClaimsPrincipalFactory<ApplicationUser>, CustomUserClaimsFactory>();

配置完成后,所有生成的用户Claims中,Name都会对应用户名,@User.Identity!.Name即可直接使用。


内容的提问来源于stack exchange,提问作者INVENTUS T.V

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 07:15:54