在视图中获取 ASP.NET 标识当前用户

Posted

技术标签:

【中文标题】在视图中获取 ASP.NET 标识当前用户【英文标题】:Get ASP.NET Identity Current User In View 【发布时间】:2015-01-24 04:27:35 【问题描述】:

我使用 ASP.NET Identity 2.0 和 MVC。我需要在视图中记录用户的姓名、姓氏、电子邮件等。怎么能得到?我只能得到@User.Identity 但没有我的用户类的属性。

//in my view, i need here my ApplicationUser class
<div>
@User.Identity.Name
</div>

//ApplicationUser class
public class ApplicationUser : IdentityUser<int, CustomUserLogin, CustomUserRole,
CustomUserClaim> 

    public ApplicationUser()
    
        this.CreatedDate = DateTime.Now;
    

    public DateTime CreatedDate  get; set; 

    public string Name  get; set; 

    public string Surname  get; set; 

    public string TaxOffice  get; set; 

【问题讨论】:

【参考方案1】:

如果您只需要获取特定属性,则可以将它们作为声明添加到 ApplicationUser 类中,如下例所示:

public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser, int> 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("FullName", this.FullName));
    // or use the ClaimTypes enumeration
    return userIdentity;

这是从 Startup.Auth 类连接起来的:

    SessionStateSection sessionStateSection = ConfigurationManager.GetSection("system.web/sessionState") as SessionStateSection;
    app.UseCookieAuthentication(new CookieAuthenticationOptions
    
        AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
        LoginPath = new PathString("/account/login"),
        CookieName = sessionStateSection.CookieName + "_Application",
        Provider = new CookieAuthenticationProvider
        
            // Enables the application to validate the security stamp when the user logs in.
            OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser, int>
                (
                     validateInterval: TimeSpan.FromMinutes(30),
                     regenerateIdentityCallback: (manager, user) => user.GenerateUserIdentityAsync(manager),
                     getUserIdCallback: (id) => (id.GetUserId<int>())
                ) 

        
    );

然后,您可以访问声明(在视图或控制器中):

var claims = ((System.Security.Claims.ClaimsIdentity)User.Identity).Claims;
var claim = claims.SingleOrDefault(m => m.Type == "FullName");

这里没有表单身份验证票。

如果您希望获得完整的用户详细信息,您始终可以创建如下扩展方法:

public static ApplicationUser GetApplicationUser(this System.Security.Principal.IIdentity identity)

    if (identity.IsAuthenticated)
    
        using (var db = new AppContext())
        
            var userManager = new ApplicationUserManager(new ApplicationUserStore(db));
            return userManager.FindByName(identity.Name);
        
    
    else
    
        return null;
            

然后这样称呼它:

@User.Identity.GetApplicationUser();

但是,如果您一直在调用它,我建议您进行缓存。

【讨论】:

【参考方案2】:

如果您使用 .NET Core 应用程序:

您可以轻松地使用 @inject 功能调用来注入 UserManagerSignInManager

在您的视图中添加以下内容:

@inject SignInManager<YourUserIdentity> SignInManager
@inject UserManager<YourUserIdentity> UserManager

注入后,您应该能够使用UserManagerSignInManager 方法。例如:

@if (SignInManager.IsSignedIn(User))

    <a asp-area="" asp-controller="Manage" asp-action="Index" title="Manage">Hello @UserManager.GetUserName(User)</a>

else


在需要引用当前登录用户时注意传递User对象。

【讨论】:

重要的是要注意@inject 是一个 ASP.Net 核心功能。正如在 ASP.Net Core 发布之前提出的问题。这不太可能回答 Yargicx 问题。但是一个好工具是 ASP.net Core Web 应用程序【参考方案3】:

有两种方法可以实现。

1) 通过继承IPrincipal 接口来创建您自己的CustomPrincipal,以包含NameSurnameEmail,使用this 示例或this 之一。

2) 直接从数据库中获取详细信息并将其作为模型传递给视图。

如果您想在多个视图中使用相同的用户详细信息,方法一将是不错的选择,但方法二是实现此目的的最简单方法。如果您需要第二种方法的任何代码帮助,请告诉我。

【讨论】:

同意:我使用了 CustomPrincipal - 更简单地把东西包装在那里,然后在任何地方都可以访问用户的那些“属性”..【参考方案4】:

要从您的控制器获取有关用户的信息 必须使用

User.Identity.GetUserId();

或者如果您想获取有关您班级中用户的信息

HttpContext.Current.User.Identity.GetUserId();

【讨论】:

以上是关于在视图中获取 ASP.NET 标识当前用户的主要内容,如果未能解决你的问题,请参考以下文章

从字符串转换为唯一标识符时 ASP.NET 转换失败

Asp.net 从 asp 中的文本框获取值到代码后面

如何在asp.net core中获取当前用户

如何在 ASP.NET MVC 视图中返回当前操作?

使用 SQL 脚本创建 ASP.NET 标识表

如何在 ASP.net vb.net 中获取当前用户 ID 的电子邮件