How to get current user, and how to use User class in MVC5?
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:
- Overview of
Identity
: https://devblogs.microsoft.com/aspnet/introducing-asp-net-identity-a-membership-system-for-asp-net-applications/ - Example solution regarding how to extend the user profile by adding an extra property: https://github.com/rustd/AspnetIdentitySample
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
Related videos on Youtube
Adam Szabo
Updated on February 23, 2020Comments
-
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 haveItems
. Should I store the User'sId
inItem
? Can I extend theUser
class with anList<Item>
navigation property?
I'm using "Individual User Accounts" from the MVC template.
Tried these:
- How do I get the current user in an MVC Application?
- How to get the current user in ASP.NET MVC
- Get logged in user's id - this throws the following:
'Membership.GetUser()' is null.
-
Adam Szabo over 10 yearsAdded 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 over 10 yearsWhen you say you are using MVC 5, what are you using for membership? OWin.Security?
-
Adam Szabo over 10 years"Individual User Accounts" from the MVC template.
-
Wiktor Zychla over 10 years
HttpContext.Current.User.Identity.Name
is the name of currently logged user. -
Adam Szabo over 10 yearsHow 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 over 10 yearsHey 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 over 10 yearsoskar132, 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 almost 10 yearsI 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 over 10 yearsUser 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 ofAss_Start\IdentityConfig.cs
, wherever you need to use it, if on a diferent namespace, you'll have to set theusing Microsoft.AspNet.Identity
for the extension to become visible. -
Derek Tomes over 10 yearsI don't suppose there is anything like pre-release docs for all this is there?
-
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/suggestions/…
-
NicoJuicy over 10 yearssurvey.UserId = Guid.Parse(User.Identity.GetUserId());
-
Zapnologica over 10 yearsIf I add the using reference User is still underlined red? Why would this be?
-
Adam Szabo over 10 years@Zapnologica: try to rebuild the project, maybe VS IntelliSense is a bit slow.
-
Vahid Ghadiri over 10 yearsGetUserId disappearance was what I stumbled into. thanks
-
Arash about 10 yearsIt imposes unnecessary database trip.
-
fabspro about 10 years@Arash, how is the application supposed to get the user's object without contacting the database?
-
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 almost 10 yearsNOTE 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 over 9 yearsRemember with mvc5 (membership 2): User.Identity.GetUserId() is different with id in table [AspNetUsers]. So Jakub Arnold and Rok is correct way
-
Isaac Kleinman over 9 years
HttpContext
is also only defined within the controller. -
andre de waard about 9 yearsGetUserId(); returns null for me. Anyone know why?
-
matt. almost 9 yearsAs of 2015 RC1 the GetUserId extension method is in the System.Security.Claims namespace
-
nest over 8 yearsok but how do I get to an instance of type
AccountController
? -
Jeeva J over 8 yearsHow to get the user details by passing token? Can we do like this?
-
Jhourlad Estrella over 8 yearsI'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 over 8 yearsTotally 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 almost 7 yearsWorth mentioning that User.Identity.IsAuthenticated and User.Identity.Name will work without adding the above mentioned using statement. This was my problem Thanks! :)
-
Fandango68 about 6 yearsObject not found for <ApplicationUserManager>
-
Ali Kanat about 5 yearsPlease do not just post code especially not without any comments. If you explain your code it would be more helpful.