繁体   English   中英

使用userManager的.NET Core身份并加载其他ApplicationUser属性

[英].NET Core Identity using userManager and load additional ApplicationUser properties

我的问题基于此处的主题但是由于不允许在此处添加评论,我想我必须打开一个新线程。

在我的ASP.NET Core后端中,我正在使用ASP.NET Core身份进行用户管理。 它在所谓的用户管理器的帮助下提供了用于用户身份验证的方法。

现在,我一方面无法使用用户管理器中的方法,另一方面却无法加载自定义的Application User属性。

方案如下:前端通过MVC控制器(HTTP请求)发送包含电子邮件地址和密码的登录dto。 现在,我想使用用户管理器提供的FindByEmailAsync方法加载应用程序用户。 我将此方法包装在一个自制的应用程序用户存储库中,在该存储库中,用户管理器是通过依赖项注入来注入的,并且还可以访问应用程序上下文。 由于用户管理器在加载用户管理器时不会加载自定义属性,因此我也必须做一些额外的工作来加载这些属性。

我首先尝试通过上下文(而不是通过用户管理器)完全加载用户。 效果很好,其他属性也可以加载。 随后尝试使用usermanager.CheckPasswordAsync方法时,问题开始。 我有一个例外:

“无法跟踪实体ApplicationUser的实例,因为已经跟踪了另一个具有相同键值的id的实例”。

我认为这是由于一方面使用上下文加载用户,而另一方面使用用户管理器执行checkPassword 然后,我尝试使用FindByEmailAsyncusermanager加载用户。 一切正常,没有异常,但是自定义属性尚未加载。 在我上面链接的线程中,有一些建议,但是没有一个对我有用。

  1. 建议:

     var user = await userManager.Users .Include(x => x.Address) .SingleAsync(x => x.NormalizedEmail == email); 

userManager.UsersIQueryable<Users> ,并且不包含Include方法。

  1. 建议:

     await context.Entry(user).Reference(x => x.Address).LoadAsync(); 

在我的情况下,自定义属性(Certificates)是一个集合,因此我使用.Collection而不是.Reference ,但是出现以下错误:

“无法加载类型为'ApplicationUser'的实体上的导航属性'Certificates',因为该实体未被跟踪。只能为跟踪的实体加载导航属性。“

有人建议如何使用用户管理器提供的方法,并向应用程序用户包括自定义属性吗?

谢谢!

我遇到了同样的问题,并注意到当您访问自定义属性之前加载DbContext时,它可以工作

var user = await userManager.Users;
_context.Users.Include(u => u.Address).FirstOrDefault(x => x.NormalizedEmail == email);

var adress = user.Address;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM