- 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
Usershould haveItems. Should I store the User’sIdinItem? Can I extend theUserclass 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.
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 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
Method 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.
Method 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;
Method 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
Method 5
I feel your pain, I’m trying to do the same thing. In my case I just want to clear the user.
I’ve created a base controller class that all my controllers inherit from. In it I override OnAuthentication and set the filterContext.HttpContext.User to null
That’s the best I’ve managed to far…
public abstract class ApplicationController : Controller
{
...
protected override void OnAuthentication(AuthenticationContext filterContext)
{
base.OnAuthentication(filterContext);
if ( ... )
{
// You may find that modifying the
// filterContext.HttpContext.User
// here works as desired.
// In my case I just set it to null
filterContext.HttpContext.User = null;
}
}
...
}
Method 6
string userName="";
string userId = "";
int uid = 0;
if (HttpContext.Current != null && HttpContext.Current.User != null
&& HttpContext.Current.User.Identity.Name != null)
{
userName = HttpContext.Current.User.Identity.Name;
}
using (DevEntities context = new DevEntities())
{
uid = context.Users.Where(x => x.UserName == userName).Select(x=>x.Id).FirstOrDefault();
return uid;
}
return uid;
Method 7
if anyone else has this situation:
i am creating an email verification to log in to my app so my users arent signed in yet, however i used the below to check for an email entered on the login which is a variation of @firecape solution
ApplicationUser user = HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>().FindByEmail(Email.Text);
you will also need the following:
using Microsoft.AspNet.Identity;
and
using Microsoft.AspNet.Identity.Owin;
Method 8
In .Net MVC5 core 2.2, I use HttpContext.User.Identity.Name . It worked for me.
Method 9
This is how I got an AspNetUser Id and displayed it on my home page
I placed the following code in my HomeController Index() method
ViewBag.userId = User.Identity.GetUserId();
In the view page just call
ViewBag.userId
Run the project and you will be able to see your userId
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0