ASP.NET MVC 5 – 身份。 如何获得当前ApplicationUser

我在我的项目中有ApplicationUser属性的Author名称的实体。 我如何获得当前logging的ApplicationUser完整对象。 在创build新的文章时,我必须将Article Author属性设置为当前的ApplicationUser

在旧的成员资格机制很简单,但在新的身份authentication方法,我不知道如何做到这一点。

我试图这样做:

  • 添加使用语句的身份扩展: using Microsoft.AspNet.Identity;
  • 然后我尝试获取当前用户: ApplicationUser currentUser = db.Users.FirstOrDefault(x => x.Id == User.Identity.GetUserId());

但我得到例外:

LINQ to Entities不识别方法System.String GetUserId(System.Security.Principal.IIdentity)方法,并且此方法不能被转换成存储expression式。 来源=的EntityFramework

您不需要直接为当前的ApplicationUser查询数据库。

这引入了对初学者有额外上下文的新的依赖性,但是将用户数据库表改变(在过去2年中是3次),但是API是一致的。 例如users AspNetUsers在Identity Framework中被称为AspNetUsers ,几个主键字段的名称不断变化,因此几个答案中的代码将不再按原样工作。

另一个问题是对数据库的底层OWIN访问将使用单独的上下文,所以单独的SQL访问的更改可能会产生无效的结果(例如,看不到对数据库所做的更改)。 解决scheme是再次使用提供的API,而不是尝试解决它。

以ASP.Net身份访问当前用户对象的正确方法是(如在此date):

 var user = UserManager.FindById(User.Identity.GetUserId()); 

或者,如果您有asynchronous操作,请执行以下操作:

 var user = await UserManager.FindByIdAsync(User.Identity.GetUserId()); 

FindById需要你有下面的using语句,以便非asynchronous的UserManager方法可用(它们是UserManager的扩展方法 ,所以如果你不包括这个,你将只能看到FindByIdAsync ):

 using Microsoft.AspNet.Identity; 

如果您根本不在控制器中(例如,您正在使用IOC注入),则用户标识将从以下位置全部检索:

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

如果您不在标准帐户控制器中,则需要将以下内容(作为示例)添加到您的控制器中:

1.添加这两个属性:

  /// <summary> /// Application DB context /// </summary> protected ApplicationDbContext ApplicationDbContext { get; set; } /// <summary> /// User manager - attached to application DB context /// </summary> protected UserManager<ApplicationUser> UserManager { get; set; } 

2.在控制器的构造函数中添加它:

  this.ApplicationDbContext = new ApplicationDbContext(); this.UserManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(this.ApplicationDbContext)); 

2015年3月更新

注意: Identity框架的最新更新更改了用于身份validation的基础类之一。 您现在可以从当前HttpContent的Owin上下文访问它。

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

附录:

在使用EF和Identity Framework与Azure时,通过远程数据库连接(例如本地主机testing到Azure数据库),您可以随意点击可怕的“错误:19 – 物理连接不可用”。 由于原因隐藏在Identity Framework中,无法添加重试(或者似乎缺less.Include(x->someTable) ),您需要在项目中实现自定义的SqlAzureExecutionStrategy

我的错误,我不应该在一个LINQ查询中使用一个方法。

正确的代码:

 string currentUserId = User.Identity.GetUserId(); ApplicationUser currentUser = db.Users.FirstOrDefault(x => x.Id == currentUserId); 

它在答复的评论中,但没有人将其作为实际的解决scheme。

你只需要在顶部添加使用语句:

 using Microsoft.AspNet.Identity; 

Ellbar的代码工作! 你只需要添加使用。

1 – using Microsoft.AspNet.Identity;

而且… Ellbar的代码:

2 – string currentUserId = User.Identity.GetUserId(); ApplicationUser currentUser = db.Users.FirstOrDefault(x => x.Id == currentUserId); string currentUserId = User.Identity.GetUserId(); ApplicationUser currentUser = db.Users.FirstOrDefault(x => x.Id == currentUserId);

使用这个代码(在currentUser ),你可以处理连接用户的一般数据,如果你想要额外的数据…看到这个链接

从ASP.NET Identity 3.0.0开始,这已经被重构

 //returns the userid claim value if present, otherwise returns null User.GetUserId(); 
 ApplicationDbContext context = new ApplicationDbContext(); var UserManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(context)); ApplicationUser currentUser = UserManager.FindById(User.Identity.GetUserId()); string ID = currentUser.Id; string Email = currentUser.Email; string Username = currentUser.UserName; 

现在,asp.mvc项目模板创build一个帐户控制器,以这种方式获取用户pipe理器:

 HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>() 

以下为我工作:

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

对于MVC 5,只需查看WebApplication模板脚手架中的ManageController的EnableTwoFactorAuthentication方法即可:

  [HttpPost] [ValidateAntiForgeryToken] public async Task<ActionResult> EnableTwoFactorAuthentication() { await UserManager.SetTwoFactorEnabledAsync(User.Identity.GetUserId(), true); var user = await UserManager.FindByIdAsync(User.Identity.GetUserId()); if (user != null) { await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false); } return RedirectToAction("Index", "Manage"); } 

答案正如微软本身所build议的那样:

 var user = await UserManager.FindByIdAsync(User.Identity.GetUserId()); 

它将具有您在ApplicationUser类中定义的所有附加属性。

Interesting Posts