我是Asp.Net Identity的新手,如果这个问题看起来很愚蠢,请多多包涵。因此,当我在下面的链接中阅读Microsoft网站中UserStore类和UserManager类的定义时,看起来这两个类都围绕用户定义了操作(如Add,Find,Delete和Modify)。那么什么时候我可以使用一个呢?

https://msdn.microsoft.com/en-us/library/dn315446(v=vs.108).aspx
https://msdn.microsoft.com/en-us/library/dn613290(v=vs.108).aspx

最佳答案

那里的事情很复杂,可能会更容易。
UserManger是...经理。它实际上并没有与存储,数据库进行交互。
那就是UserStore所做的。

实际上,UserManager有一个constructor,它需要一个UserStore。

您为什么要以不同的对象来管理用户?
好吧,主要原因是您可以决定不使用EF并创建自己的用户存储。

当您尝试实现自己的存储提供程序时,事情会变得更加清晰。
我做到了,我的代码可以从github下载。

这是UserManager。如您所见,里面没有太多东西。只需几行代码即可配置验证器。

相反,UserStore很大。在该示例中,我实现了一些接口(interface)并覆盖了一些方法。
如果要自定义与数据库的交互和/或扩展类,则将执行此操作。

您通常不会与UserStore交互,实际上它是隐藏的。您只需创建它,然后将其传递给UserManager,然后……就算了。

您始终可以自定义UserManager并公开UserStore:

public class UserManager : UserManager<User, int>
{
    public UserManager(IUserStore<User, int> store): base(store)
    {
        this.Store = store;
    }

    public IUserStore<User, int> Store { get; set; }

}

也许还有ovveride的一些方法:
public class UserManager : UserManager<User, int>
{
    public UserManager(IUserStore<User, int> store): base(store)
    {
        this.Store = store;
    }

    public IUserStore<User, int> Store { get; set; }

    public override System.Threading.Tasks.Task<IdentityResult> CreateAsync(User user)
    {
        return base.CreateAsync(user);
    }
}

但这将毫无意义,除非您必须进行一些特殊的自定义。

假设您要使用商店而不是经理来创建用户。您可以执行以下操作:
await this.UserManager.Store.CreateAsync(new Custom.Identity.User() { UserName = "LeftyX" });

它会工作。

如您所见,在上面的类中,我已经覆盖了UserManager中的CreateAsync
该方法调用UserStore.CreateAsync(),实际上,您必须调用基本方法CreateAsync:
public override System.Threading.Tasks.Task<IdentityResult> CreateAsync(User user)
   {
       return base.CreateAsync(user);
   }

如果您不这样做,例如,返回null,则不会调用UserStore.CreateAsync,也不会创建用户。

最后有道理。

我想理解该框架如何工作的最好方法是尝试使用自己的存储来定制/实现您的解决方案,并查看所有类之间如何交互。

样本project不与数据库交互,但使用json存储。调试非常容易。放手一搏,事情会在某些时候变得更加清晰。

09-27 00:56