14

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 property.

//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; }
}
Yargicx
  • 1,704
  • 3
  • 16
  • 36

4 Answers4

20

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.

ScottE
  • 21,530
  • 18
  • 94
  • 131
7

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.

Adir Ratzon
  • 181
  • 3
  • 8
  • 1
    Important to note that @inject is an ASP.Net Core Feature. As the Question was asked before ASP.Net Core was released. This is unlikely to answer Yargicx Question. But is a good tool is an ASP.net Core web app – Luke Hammer Mar 06 '18 at 18:59
4

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.

Community
  • 1
  • 1
DSR
  • 4,588
  • 29
  • 28
  • 1
    Agreed: I've used CustomPrincipal - much simpler to wrap things up there and then those 'attributes' of a user are accessible everywhere.. – Robert Achmann Dec 02 '14 at 15:15
1

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();
minenhle
  • 57
  • 1
  • 9