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

Min*_*yen 28 c# asp.net-mvc owin asp.net-identity

我是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

Lef*_*tyX 44

那里的事情非常复杂,可能会更容易.

UserManger是...经理.它实际上并不与存储,数据库交互.这就是它的UserStore作用.

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

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

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

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

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

你通常不与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; }

}
Run Code Online (Sandbox Code Playgroud)

并且,也许,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);
    }
}
Run Code Online (Sandbox Code Playgroud)

但除非你必须做一些特殊的定制,否则这将毫无意义.

假设您要使用商店而不是经理创建用户.你可以这样做:

await this.UserManager.Store.CreateAsync(new Custom.Identity.User() { UserName = "LeftyX" });
Run Code Online (Sandbox Code Playgroud)

它会起作用.

在上面的课程中,正如您所看到的,我已经CreateAsync在UserManager中覆盖了它.
该方法调用UserStore.CreateAsync(),实际上,您必须调用基本方法CreateAsync:

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

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

最后它是有道理的.

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

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

  • Store = Repository/Manager = Service (3认同)
  • @MinhNguyen:正如我所说,UserStore是因为有些人想要实现他们的提供者而不是EF.它没有曝光.您无法自定义UserManager以更改数据提供程序.你简单不了.您需要实现您的UserStore.UserStore是DDD中的存储库. (2认同)

Ada*_*dam 5

身份基于 ASP.NET Identity 中的两个主要块。有一个采用类形式的身份验证管理器UserManager<T>。还有商店经理,它是 的一个实例UserStore<T>

不同之处?

UserStore<T>对象被注入到身份验证管理器中,用于识别和验证身份UserStore<T>。该UserManager<T>引用充当身份的验证者UserStore<T>

重要细节

ASP.NET Identity 基于最新的开放 Web 界面。这意味着[通常],在链接此处Microsoft.Owin.Security声明的 IAuthenticationManager 接口,将身份验证器注入到类和控制器中,以及基本上涉及身份验证步骤的每个操作。UserManager

在下面的:

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

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

结论UserManager本质上是 ASP.NET Identity 的域逻辑。用于处理“登录”或“身份验证”的控制器由 a 传入UserStore,正如MSDN:Userstore所描述的......

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

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

  • 类之间的方法不同吗?它们具有相同的名称,但一个向用户添加或删除声明,另一个从身份验证“集合”中添加或删除用户声明 (3认同)

Sas*_*san 5

我正在 YouTube 上观看 Identity 教程,我认为此屏幕截图可能会有所帮助:

经理与商店

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

对于那些它使用 UserStore 并对其说的事情,例如“嘿 UserStore 我有一个新用户需要保存以备将来使用,我不知道您将在哪里保存它以及您将如何做给我留着吧”

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

与仅适用于 SQL Server 的 Membership 相比,这是添加到 Identity 的功能之一。

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