如何获取当前用户,以及如何在MVC5中使用User类?

  • 我怎样才能得到MVC 5当前login用户的ID? 我尝试了StackOverflow的build议,但他们似乎不适合MVC 5。
  • 另外,什么是MVC 5分配给用户的最佳做法? (例如,一个User应该有Items我应该存储用户的IdItem ?我可以用一个List<Item>导航属性扩展User类别?

我正在使用MVC模板中的“个人用户帐户”。

试过这些:

  • 如何在MVC应用程序中获取当前用户?
  • 如何获取ASP.NET MVC中的当前用户
  • 获取login用户的ID – 这将引发以下内容:

'Membership.GetUser()'为null。

如果您在ASP.NET MVC控制器中编码,请使用

 using Microsoft.AspNet.Identity; ... User.Identity.GetUserId(); 

值得一提的是, User.Identity.IsAuthenticatedUser.Identity.Name将在不添加上述using语句的情况下工作。 但是没有它, GetUserId()将不会出现。

如果你在一个控制器以外的课程,使用

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

在MVC 5的默认模板中,用户ID是一个存储为string的GUID。

还没有最佳实践,但发现了一些关于扩展用户configuration文件的有价值的信息:

  • Identity概述: http : //blogs.msdn.com/b/webdev/archive/2013/06/27/introducing-asp-net-identity-membership-system-for-asp-net-applications.aspx
  • 有关如何通过添加额外属性来扩展用户configuration文件的示例解决scheme: https : //github.com/rustd/AspnetIdentitySample

尝试像这样:

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

适用于RTM。

如果您希望在一行代码中使用ApplicationUser对象(如果您安装了最新的ASP.NET身份),请尝试:

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

您将需要使用以下语句:

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

获得ID是非常简单的,你已经解决了这个问题。

你的第二个问题虽然是多一点涉及。

所以,这是所有预先发布的东西,但是你面对的常见问题是用户使用新的属性(或者你正在讨论的Items集合)来扩展用户。

开箱后,您将在Models文件夹下(在撰写本文时)获得一个名为IdentityModel的文件。 在那里你有几个class; ApplicationUserApplicationDbContext 。 要添加您的Items集合,您将需要修改ApplicationUser类,就像您使用Entity Framework的普通类一样。 事实上,如果你仔细研究一下,你会发现所有与身份相关的类(用户,angular色等等)都是POCO,现在有了适当的数据注释,所以他们在EF6上玩的很好。

接下来,您需要对AccountController构造函数进行一些更改,以便知道如何使用DbContext。

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

现在让你的login用户获得整个用户对象是一个小老实说。

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

该行将完成工作,你将能够访问userWithItems.Items像你想要的。

HTH

我感到你的痛苦,我试图做同样的事情。 在我的情况下,我只是想清除用户。

我创build了一个基本的控制器类,所有我的控制器inheritance。 在其中我重写OnAuthentication并将OnAuthentication设置filterContext.HttpContext.User to null

这是我所做到的最好的…

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