如何获取当前用户,以及如何在MVC5中使用User类?
- 我怎样才能得到MVC 5当前login用户的ID? 我尝试了StackOverflow的build议,但他们似乎不适合MVC 5。
- 另外,什么是MVC 5分配给用户的最佳做法? (例如,一个
User
应该有Items
我应该存储用户的Id
在Item
?我可以用一个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.IsAuthenticated
和User.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; ApplicationUser
和ApplicationDbContext
。 要添加您的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; } } ... }