使用userManager的.NET核心标识并加载其他ApplicationUser属性

时间:2018-06-06 15:52:45

标签: c# .net-core asp.net-identity

我的问题基于here主题,但由于我不允许在那里添加评论,我想我必须打开一个新主题。

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

我现在在使用用户管理器中的方法和另一方面加载自定义应用程序用户属性方面遇到了麻烦。

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

我首先尝试通过上下文(而不是通过用户管理器)完全加载用户。这工作正常,其他属性也可以加载。在尝试使用usermanager.CheckPasswordAsync方法之后,问题就开始了。我有一个例外:

  

“无法跟踪实体ApplicationUser的实例   因为id的另一个具有相同键值的实例已经存在   被追踪“。

我认为这是因为使用上下文加载用户和用户管理器来执行checkPassword。然后,我尝试使用FindByEmailAsync的{​​{1}}加载用户。一切正常,没有例外,但自定义属性尚未加载。在我上面链接的主题中有一些建议,但它们都不适合我。

  1. 建议:

    usermanager
  2. var user = await userManager.Users .Include(x => x.Address) .SingleAsync(x => x.NormalizedEmail == email); userManager.Users,不包含Include方法。

    1. 建议:

      IQueryable<Users>
    2. 在我的情况下,自定义属性(证书)是一个集合,因此我使用await context.Entry(user).Reference(x => x.Address).LoadAsync(); 而不是.Collection,但收到以下错误:

        

      “类型实体上的导航属性'证书'   无法加载“ApplicationUser”,因为实体不在   跟踪。只能加载导航属性以进行跟踪   实体“。

      是否有人建议如何使用提供的用户管理器方法并将自定义属性包含给应用程序用户?

      谢谢!

1 个答案:

答案 0 :(得分:0)

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

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

var adress = user.Address;