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 为空