在Asp.Net Identtity中使用UserStore和UserManager有什么区别?

我对Asp.Net Identity非常新,如果这个问题看起来很愚蠢,请耐心等待。 因此,当我在Microsoft网站上阅读下面链接中的UserStore类和UserManager类的定义时,看起来这两个类都定义了围绕用户的操作(如添加,查找,删除和修改)。 那我什么时候用一个呢?

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是……经理。 它并不真正与存储,数据库交互。 这就是UserStorefunction。

实际上,UserManager有一个需要UserStore的构造函数。

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

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

这是UserManager 。 正如你所看到的,那里并不多。 只需几行代码即可配置validation器。

相反, UserStore相当大。 在那个例子中,我实现了一些接口并覆盖了一些方法。 如果您想自定义与数据库的交互和/或扩展您的类,那么您将会这样做。

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

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

 public class UserManager : UserManager { public UserManager(IUserStore store): base(store) { this.Store = store; } public IUserStore Store { get; set; } } 

并且,也许,ovveride的一些方法:

 public class UserManager : UserManager { public UserManager(IUserStore store): base(store) { this.Store = store; } public IUserStore Store { get; set; } public override System.Threading.Tasks.Task 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 CreateAsync(User user) { return base.CreateAsync(user); } 

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

最后它是有道理的。

我想了解这个框架如何工作的最好方法是尝试使用您自己的存储自定义/实现您的解决方案,并查看所有类如何相互交互。

示例项目不与数据库交互,但使用json存储。 它很容易调试。 试一试,事情会在某些时候更清晰。

标识基于ASP.NET标识中的两个主要块。 有一个身份validation管理器,它采用UserManager类的forms。 还有商店经理,它是UserStore一个实例。

区别?

UserStore对象被注入到身份validation管理器中,该管理器用于识别和validationUserStore身份。 UserManager引用充当UserStore标识的validation者。

重要细节

ASP.NET Identity基于最新的Open Web Interface。 这意味着[通常],在Microsoft.Owin.Security声明的IAuthenticationManager接口: 在这里链接 ,身份validation器注入UserManager类和控制器,基本上每个涉及身份validation步骤的操作。

在下面的:

 private async Task SignInAsync(ApplicationUser user, bool isPersistent) { var identity = await UserManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie); AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = isPersistent }, identity); } 

我们可以注意到UserManager身份validation管理器用于根据身份validation管理器的身份检查“ UserStore ”应用程序用户。 从博客采取的片段。

结束语 UserManager本质上是ASP.NET标识的域逻辑。 用于处理“登录”或“标识”的控制器由UserStore ,作为MSDN:Userstore描述…

表示支持IUserStore,IUserLoginStore,IUserClaimStore和IUserRoleStore的用户存储的entity framework实现。

一旦UserStore具有要被限定为身份的所有必需字段并且您已将UserManager限定为身份validation管理器,并且存储上下文的方法…又称IdentityDbContext或在SQL中存储值的一些其他方法(如果使用) ,您将拥有一个能够支持登录的Identity系统。

我正在观看YouTube上的身份教程,我认为这个截图可能会有所帮助:

经理人与商店

因此,UserManager是您应该使用的实际类,但它不知道如何从数据库中存储和检索数据。 它甚至不知道数据的来源和来源。

对于那些东西,它使用UserStore,并说它例如“嘿UserStore我有一个新用户需要保存以备将来使用,我不知道你将保存它以及你将如何做它,只为我保存它“

然后UserStore执行实际工作,例如应该保存数据的位置? 哪个数据库? 如何? 默认的使用EF和SQL Server,因此如果您想使用其他数据库(例如MySQL),您将需要一个不同的UserStore。

与仅与SQL Server一起使用的成员资格相比,这是添加到Identity的function之一。

RoleManager和RoleStore也是如此。