Get ASP.NET Identity Current User In View

后端 未结 4 1537
無奈伤痛
無奈伤痛 2020-12-30 05:01

I use ASP.NET Identity 2.0 and MVC. I need to logged user\'s name,surname,email etc.. in view. How can get it? I can get just @User.Identity but there no my user class\'s pr

相关标签:
4条回答
  • 2020-12-30 05:46

    In case you using .NET Core app:

    You can easily use the @inject feature call for injecting both UserManager and SignInManager.

    In your view add the following:

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

    After the injection, you should be able to work with UserManager and SignInManager methods. For instance:

    @if (SignInManager.IsSignedIn(User))
    {
        <a asp-area="" asp-controller="Manage" asp-action="Index" title="Manage">Hello @UserManager.GetUserName(User)</a>
    }
    else
    {
    }
    

    Pay attention for passing the User object when you need to reference the current logged in user.

    0 讨论(0)
  • 2020-12-30 05:51

    If there are only specific properties that you need to get, you can add them as claims in your ApplicationUser class like the following example:

    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;
    }
    

    This gets wired up from the Startup.Auth class:

        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>())
                    ) 
    
            }
        });
    

    Then, you can access the claim (in a view or in a controller):

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

    No forms authentication tickets here.

    If you want the full user details available, you could always create an extension method like the following:

    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;
        }        
    }
    

    And call it like this:

    @User.Identity.GetApplicationUser();
    

    I would recommend caching if you're calling this all this time, however.

    0 讨论(0)
  • 2020-12-30 05:55

    There are two ways you can achieve this.

    1) Create your own CustomPrincipal by inheriting IPrincipal interface to include Name, Surname and Email using this example or this one.

    2) Get details directly from the database and pass it as a model to the view.

    Method one will be good option if you want to use same user details in several views, but method two is the simplest way to achieve this. let me know if you need any code help for the second method.

    0 讨论(0)
  • 2020-12-30 06:00

    to get information about the user from the controller you must use

    User.Identity.GetUserId();
    

    or if you want to get information about the user within your class

    HttpContext.Current.User.Identity.GetUserId();
    
    0 讨论(0)
提交回复
热议问题