您应该不需要直接在数据库中查询当前的 ApplicationUser。
这引入了一个新的依赖关系,即为初学者提供额外的上下文,但未来用户数据库表会发生变化(过去 2 年中发生了 3 次),但 API 是一致的。例如,users 表在 Identity Framework 中现在称为 AspNetUsers,并且几个主键字段的名称不断变化,因此几个答案中的代码将不再工作原样。
另一个问题是对数据库的底层 OWIN 访问将使用单独的上下文,因此来自单独 SQL 访问的更改可能会产生无效结果(例如,看不到对数据库所做的更改)。同样,解决方案是使用提供的 API,而不是尝试解决方法。
以 ASP.Net 身份访问当前用户对象的正确方法(截至目前)是:
var user = UserManager.FindById(User.Identity.GetUserId());
或者,如果您有异步操作,例如:
var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
FindById 要求您具有以下 using 语句,以便非异步 UserManager 方法可用(它们是 UserManager 的 扩展方法,因此如果您不包含此方法,您将只见FindByIdAsync):
using Microsoft.AspNet.Identity;
如果您根本不在控制器中(例如,您正在使用 IOC 注入),则从以下位置完整检索用户 ID:
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。在 Controller 的构造函数中添加:
this.ApplicationDbContext = new ApplicationDbContext();
this.UserManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(this.ApplicationDbContext));
2015 年 3 月更新
注意:身份框架的最新更新更改了用于身份验证的底层类之一。您现在可以从当前 HttpContent 的 Owin 上下文访问它。
ApplicationUser user = System.Web.HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>().FindById(System.Web.HttpContext.Current.User.Identity.GetUserId());
附录:
在 Azure 中使用 EF 和 Identity Framework 时,通过远程数据库连接(例如,本地主机测试到 Azure 数据库),您可能会随机遇到可怕的“错误:19 - 物理连接不可用”。由于原因隐藏在 Identity Framework 中,您无法在其中添加重试(或似乎缺少 .Include(x->someTable)),因此您需要在项目中实现自定义 SqlAzureExecutionStrategy。