C# 在ASP.NET Identity中使用UserStore和UserManager有什么区别?

C# 在ASP.NET Identity中使用UserStore和UserManager有什么区别?,c#,asp.net-mvc,asp.net-identity,owin,C#,Asp.net Mvc,Asp.net Identity,Owin,我对ASP.NET身份非常陌生,如果这个问题看起来很愚蠢,请容忍我 当我阅读下面链接中Microsoft网站上的UserStore和UserManager类的定义时,这两个类似乎都定义了用户的操作(如添加、查找、删除和修改) 那我什么时候用一个来代替另一个呢 标识基于ASP.NET标识中的两个主块。有一个身份验证管理器,其形式为UserManager类。还有商店管理器,它是UserStore的一个实例 差异? UserStore对象被注入身份验证管理器,该管理器用于识别和验证UserStore

我对ASP.NET身份非常陌生,如果这个问题看起来很愚蠢,请容忍我

当我阅读下面链接中Microsoft网站上的
UserStore
UserManager
类的定义时,这两个类似乎都定义了用户的操作(如添加、查找、删除和修改)

那我什么时候用一个来代替另一个呢


标识基于ASP.NET标识中的两个主块。有一个身份验证管理器,其形式为
UserManager
类。还有商店管理器,它是
UserStore
的一个实例

差异?

UserStore
对象被注入身份验证管理器,该管理器用于识别和验证
UserStore
身份。
UserManager
引用充当
UserStore
标识的验证器

重要细节

ASP.NET标识基于最新的开放式Web界面。这意味着,[通常],
Microsoft.Owin.Security
中声明的IAAuthenticationManager接口,插入到
UserManager
类和控制器中的身份验证程序,以及基本上涉及身份验证步骤的每个操作

在以下方面:

private async Task SignInAsync(ApplicationUser user, bool isPersistent)
{
    var identity = await UserManager.CreateIdentityAsync(user,
    DefaultAuthenticationTypes.ApplicationCookie);
    AuthenticationManager.SignIn(new AuthenticationProperties() {
    IsPersistent = isPersistent }, identity);
}
我们可以注意到,
UserManager
身份验证管理器用于根据身份验证管理器的身份检查“
UserStore
”应用程序用户

结论
UserManager
基本上是ASP.NET标识的域逻辑。用于处理“登录”或“标识”的控制器由
UserStore
传入,如图所示

表示支持IUserStore、IUserLoginStore、IUserClaimStore和IUserRoleStore的用户存储的实体框架实现


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

那里的事情相当复杂,本来可能更容易

UserManger
是。。。经理它实际上并不与存储、数据库交互。 这就是
UserStore
所做的

事实上,UserManager有一个需要UserStore的应用程序

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

当您尝试实施自己的存储提供商时,事情会变得更清楚。 我做到了,我的代码可以从下载

这是最新的。正如你所看到的,里面没有多少东西。只需几行代码即可配置验证器

相反,它相当大。在那个示例中,我实现了几个接口并重写了几个方法。 如果您希望自定义与数据库的交互和/或扩展类,那么您将这样做

您通常不会与
UserStore
交互,事实上它是隐藏的。您只需创建它并将其传递给
用户管理器
,然后。。。算了吧

您始终可以自定义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; }

}
这会奏效的

如您所见,在上面的类中,我已经覆盖了UserManager中的
CreateAsync

该方法调用
UserStore.CreateAsync()
,实际上,您必须调用基本方法CreateAsync:

public override System.Threading.Tasks.Task<IdentityResult> CreateAsync(User user)
   {
       return base.CreateAsync(user);
   }
public override System.Threading.Tasks.Task CreateAsync(用户)
{
返回base.CreateAsync(用户);
}
如果不这样做,例如,返回null,则不会调用
UserStore.CreateAsync
,也不会创建用户

这最终是有道理的

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


该示例不与数据库交互,而是使用json存储。它很容易调试。试一试,事情会在某个时候变得更清楚。

我在YouTube上观看了身份教程,我想这个截图可能会有所帮助:

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

对于这些东西,它使用UserStore并对它说:“嘿,UserStore,我有一个新用户需要保存以备将来使用,我不知道你要保存到哪里以及如何保存,请保存给我”

然后UserStore执行实际工作,例如数据应该保存在哪里?哪个数据库?怎么做?默认的数据库使用EF和SQLServer,因此如果您想使用其他数据库,例如MySQL,则需要另一个UserStore

与仅适用于SQL Server的成员资格相比,这是添加到Identity的功能之一


同样的概念也适用于RoleManager和RoleStore。

这仍然让我困惑。这是我的理解:为了实现针对用户的操作,UserManager在UserStore对象上执行。UserStore的主要用途是检索用户集合。那么,我们为什么不把所有的操作(方法)只放在UseManager类中呢?UserStore和UserManaer中的方法(添加、删除…)有什么区别?类之间的方法不同?它们具有相同的名称,但一个添加或删除对用户的声明,另一个从中添加或删除用户声明
await this.UserManager.Store.CreateAsync(new Custom.Identity.User() { UserName = "LeftyX" });
public override System.Threading.Tasks.Task<IdentityResult> CreateAsync(User user)
   {
       return base.CreateAsync(user);
   }