ASP.NET MVC 5-身份。如何获得当前的ApplicationUser
我的项目中有一个Article实体,其ApplicationUser
属性名为Author
。如何获取当前已记录的完整对象ApplicationUser
?在创建新文章时,我必须将Author
属性设置Article
为current
ApplicationUser
。
在旧的成员资格机制中,这很简单,但是在新的身份方法中,我不知道该怎么做。
我试图这样做:
- 为身份扩展添加using语句:
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)’,并且该方法无法转换为商店表达式。来源=
EntityFramework
回答:
回答:
这就引入了新的依赖关系,即需要为初学者提供额外的上下文,但是以后用户数据库表会发生变化(过去2年中有3次变化),但API保持一致。例如,users
现在AspNetUsers
在Identity
Framework中调用该表,并且几个主键字段的名称保持不变,因此多个答案中的代码将不再 按原样 工作。
另一个问题是对数据库的基础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();
如果您不在标准帐户控制器中,则需要向控制器添加以下内容(作为示例):
回答:
/// <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; }
回答:
this.ApplicationDbContext = new ApplicationDbContext(); this.UserManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(this.ApplicationDbContext));
注意: Identity框架的最新更新更改了用于身份验证的基础类之一。 现在,您可以从当前HttpContent的Owin上下文中访问它。
ApplicationUser user = System.Web.HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>().FindById(System.Web.HttpContext.Current.User.Identity.GetUserId());
回答:
当将EF和Identity
Framework与Azure一起使用时,通过远程数据库连接(例如,对Azure数据库的本地主机测试),您可以随意打出可怕的“错误:19-物理连接不可用”。由于原因被埋没在Identity
Framework中,因此您无法在其中添加重试(或似乎丢失的内容.Include(x->someTable)
),因此需要SqlAzureExecutionStrategy
在项目中实现自定义。
以上是 ASP.NET MVC 5-身份。如何获得当前的ApplicationUser 的全部内容, 来源链接: utcz.com/qa/417337.html