User.Identity.Name 返回的是 UserName 而不是 Name

Posted

技术标签:

【中文标题】User.Identity.Name 返回的是 UserName 而不是 Name【英文标题】:User.Identity.Name is returning UserName instead of Name 【发布时间】:2017-06-17 08:55:14 【问题描述】:

我想在 _LoginPartial 中的导航栏中显示用户的名称,而不是用户名。目前我使用User.Identity.GetUserName() 作为用户名,但现在我想显示当前用户的名称。

_LoginPartial 由 Startup.Auth.cs 调用,因此我无法在后端运行查询并获取用户名,因此我只能使用 razor 视图中可以运行的内置函数。

我已经尝试了所有这些,但它们都给了我用户名而不是用户名。

<small>@System.Threading.Thread.CurrentPrincipal.Identity.Name</small>
<small>@User.Identity.Name</small>
<small>@threadPrincipal.Identity.Name</small>
<small>@System.Web.HttpContext.Current.User.Identity.Name</small>

如何获取名称而不是用户名

这是用户表

ID
Email
EmailConfirm
Password
Security
PhoneNumber
PhoneNumberConfirm
TwoFactorEnable
LockoutEndDateUtc
LockoutEnable
AccessFailedCount
UserName
Name
Status
Image

【问题讨论】:

问题解决了吗? 还在努力解决。 【参考方案1】:

由于名称是 ApplicationUser(扩展的 IdentityUser)的自定义字段,您需要将该字段添加为声明。

如果您使用模板 来设置Identity,那么您会在IdentityModels.cs 中找到ApplicationUser 类。在这里,我添加了一个字段“名称”并将其添加为声明:

public class ApplicationUser : IdentityUser

    public string Name  get; set; 

    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
    
        // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
        var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);

        // Add custom user claims here
        userIdentity.AddClaim(new Claim("CustomName", Name));

        return userIdentity;
    

此代码将添加具有名称值的声明“CustomName”。

在您看来,您现在可以阅读声明。这是 _LoginPartial 中的一个示例:

<ul class="nav navbar-nav navbar-right">
    <li>
        @ var user = (System.Security.Claims.ClaimsIdentity)User.Identity; 
        @html.ActionLink("Hello " + user.FindFirstValue("CustomName") + "!", "Index", "Manage", routeValues: null, htmlAttributes: new  title = "Manage" )
    </li>

您可以添加其他自定义字段以及声明。

【讨论】:

我尝试通过添加 FirstName 并为其分配名称,但是编译器给出了一个错误,我必须将其写入用户模型和 addUser 中。 我做了同样的事情,但编译器说“IPrincipal”不包含“FindFirst”的定义,并且找不到接受“IPrincipal”类型的第一个参数的扩展方法“FindFirst”(你是缺少 using 指令或程序集引用?)" 请告诉我,我应该把这段代码放在哪里。我无法在 GenerateUserIdentityAsync 方法中访问用户。 您不必在 GenerateUserIdentityAsync 中访问 User,因为 ApplicationUser 是用户。您应该在控制器或视图中访问用户。 非常感谢。它的工作,user.FindFirst("CustomName")?.Value 给了我像 CustomName:Name?.Value 这样的数据。 user.FindFirstValue("CustomName") 给了我当前用户的名字。非常感谢您的帮助..

以上是关于User.Identity.Name 返回的是 UserName 而不是 Name的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET C#中怎么让 httpcontext.current.user.identity.name 获取为自定义的值

为啥 SignalR Context.User.Identity.Name 为空?

HttpContext.Current.User.Identity.Name 为空

HttpContext.Current.User.Identity.Name 为空

内置帮助器将 User.Identity.Name 解析为 Domain\Username

User.Identity.Name 有啥问题