我是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存储。调试非常容易。放手一搏,事情会在某些时候变得更加清晰。