How to get current user, and how to use User class in MVC5?

222,069

Solution 1

If you're coding in an ASP.NET MVC Controller, use

using Microsoft.AspNet.Identity;

...

User.Identity.GetUserId();

Worth mentioning that User.Identity.IsAuthenticated and User.Identity.Name will work without adding the above mentioned using statement. But GetUserId() won't be present without it.

If you're in a class other than a Controller, use

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

In the default template of MVC 5, user ID is a GUID stored as a string.

No best practice yet, but found some valuable info on extending the user profile:

Solution 2

Try something like:

var store = new UserStore<ApplicationUser>(new ApplicationDbContext());
var userManager = new UserManager<ApplicationUser>(store);
ApplicationUser user = userManager.FindByNameAsync(User.Identity.Name).Result;

Works with RTM.

Solution 3

If you want the ApplicationUser object in one line of code (if you have the latest ASP.NET Identity installed), try:

ApplicationUser user = System.Web.HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>().FindById(System.Web.HttpContext.Current.User.Identity.GetUserId());

You'll need the following using statements:

using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.Owin;

Solution 4

Getting the Id is pretty straight forward and you've solved that.

Your second question though is a little more involved.

So, this is all prerelease stuff right now, but the common problem you're facing is where you're extending the user with new properties ( or an Items collection in you're question).

Out of the box you'll get a file called IdentityModel under the Models folder (at the time of writing). In there you have a couple of classes; ApplicationUser and ApplicationDbContext. To add your collection of Items you'll want to modify the ApplicationUser class, just like you would if this were a normal class you were using with Entity Framework. In fact, if you take a quick look under the hood you'll find that all the identity related classes (User, Role etc...) are just POCOs now with the appropriate data annotations so they play nice with EF6.

Next, you'll need to make some changes to the AccountController constructor so that it knows to use your DbContext.

public AccountController()
{
    IdentityManager = new AuthenticationIdentityManager(
    new IdentityStore(new ApplicationDbContext()));
}

Now getting the whole user object for your logged in user is a little esoteric to be honest.

    var userWithItems = (ApplicationUser)await IdentityManager.Store.Users
    .FindAsync(User.Identity.GetUserId(), CancellationToken.None);

That line will get the job done and you'll be able to access userWithItems.Items like you want.

HTH

Share:
222,069

Related videos on Youtube

Adam Szabo
Author by

Adam Szabo

Updated on February 23, 2020

Comments

  • Adam Szabo
    Adam Szabo about 4 years
    • How can I get the id of the currently logged in user in MVC 5? I tried the StackOverflow suggestions, but they seem to be not for MVC 5.
    • Also, what is the MVC 5 best practice of assigning stuff to the users? (e.g. a User should have Items. Should I store the User's Id in Item? Can I extend the User class with an List<Item> navigation property?

    I'm using "Individual User Accounts" from the MVC template.

    Tried these:

    'Membership.GetUser()' is null.

    • Adam Szabo
      Adam Szabo over 10 years
      Added the references of what I've tried. The last one was OK in MVC4 but not in MVC5. Also I need some best practice of "using User" :)
    • Aron
      Aron over 10 years
      When you say you are using MVC 5, what are you using for membership? OWin.Security?
    • Adam Szabo
      Adam Szabo over 10 years
      "Individual User Accounts" from the MVC template.
    • Wiktor Zychla
      Wiktor Zychla over 10 years
      HttpContext.Current.User.Identity.Name is the name of currently logged user.
    • Adam Szabo
      Adam Szabo over 10 years
      How to get the Id? I would like to assign the current user to the Item he creates, but not based on the username (that might change). It's not working by the way ` HttpContext.Current 'System.Web.HttpContextBase' does not contain a definition for 'Current' and no extension method 'Current' accepting a first argument of type 'System.Web.HttpContextBase' could be found (are you missing a using directive or an assembly reference?)`. Are you sure your solution is for MVC 5?
    • oskar132
      oskar132 over 10 years
      Hey so I managed to get it with User.Identity.GetUserId(), you can get an idea of how they use it on the login partial view of a sample project that uses asp.net's Identity. Any doubts just let me know, by the way the id is a huge string.
    • Adam Szabo
      Adam Szabo over 10 years
      oskar132, thanks, I solved it way back, details in my own answer. It also mentions that the user ID is a GUID stored as a string.
    • Bojangles
      Bojangles almost 10 years
      I always make people sign up in my software with their email address and keep track of them with that. Their email is always unique and the ball is then in their court and their email provider. I then make sure my application is ready so that if they need to change their email address it will be a simple process to do so. It's not rocket science, it's just a little bit trickier!
  • Anderson Matos
    Anderson Matos over 10 years
    User authentication and authorization have changed for ASP.NET MVC 5. Now it's a Claims-based authentication with interfaces and generic repositories that you can use with EF or other provider (EF implementation comes as a default). Since GetUserId is an extension method stored at the bottom of Ass_Start\IdentityConfig.cs, wherever you need to use it, if on a diferent namespace, you'll have to set the using Microsoft.AspNet.Identity for the extension to become visible.
  • Derek Tomes
    Derek Tomes over 10 years
    I don't suppose there is anything like pre-release docs for all this is there?
  • EightyOne Unite
    EightyOne Unite over 10 years
    @Derek Tomes - Not that I've come across. I reckon we'll have to wait until Nov 13 for real docs. It's not been great to be honest, there's even a request for better guidance over at uservoice - aspnet.uservoice.com/forums/41199-general-asp-net/suggestion‌​s/…
  • NicoJuicy
    NicoJuicy over 10 years
    survey.UserId = Guid.Parse(User.Identity.GetUserId());
  • Zapnologica
    Zapnologica over 10 years
    If I add the using reference User is still underlined red? Why would this be?
  • Adam Szabo
    Adam Szabo over 10 years
    @Zapnologica: try to rebuild the project, maybe VS IntelliSense is a bit slow.
  • Vahid Ghadiri
    Vahid Ghadiri over 10 years
    GetUserId disappearance was what I stumbled into. thanks
  • Arash
    Arash about 10 years
    It imposes unnecessary database trip.
  • fabspro
    fabspro about 10 years
    @Arash, how is the application supposed to get the user's object without contacting the database?
  • fabspro
    fabspro about 10 years
    @Arash never mind, I see what you mean. The ID can be retrieved with User.Identity.GetUserId(); without any database trip.
  • Adween
    Adween almost 10 years
    NOTE User is only available in a Controller msdn.microsoft.com/en-us/library/… (@Zapnologica are you using it outside of a controller? try HttpContext.Current.User.Identity.GetUserId();)
  • Grey Wolf
    Grey Wolf over 9 years
    Remember with mvc5 (membership 2): User.Identity.GetUserId() is different with id in table [AspNetUsers]. So Jakub Arnold and Rok is correct way
  • Isaac Kleinman
    Isaac Kleinman over 9 years
    HttpContext is also only defined within the controller.
  • andre de waard
    andre de waard about 9 years
    GetUserId(); returns null for me. Anyone know why?
  • matt.
    matt. almost 9 years
    As of 2015 RC1 the GetUserId extension method is in the System.Security.Claims namespace
  • nest
    nest over 8 years
    ok but how do I get to an instance of type AccountController?
  • Jeeva J
    Jeeva J over 8 years
    How to get the user details by passing token? Can we do like this?
  • Jhourlad Estrella
    Jhourlad Estrella over 8 years
    I'm a bit confused with the answer. I'm getting a UserStore type doesn't seem to exist in my controller context. Any ideas?
  • abzarak
    abzarak over 8 years
    Totally wrong approach. There is another issue with this code. UserManager is instantiated once per one owin context. there is no need to instantiate it again every time you need it. just get it from owincontext.
  • Samra
    Samra almost 7 years
    Worth mentioning that User.Identity.IsAuthenticated and User.Identity.Name will work without adding the above mentioned using statement. This was my problem Thanks! :)
  • Fandango68
    Fandango68 about 6 years
    Object not found for <ApplicationUserManager>
  • Ali Kanat
    Ali Kanat about 5 years
    Please do not just post code especially not without any comments. If you explain your code it would be more helpful.