【问题标题】:What is the difference in the use of UserStore and UserManager in ASP.NET Identity?ASP.NET Identity 中 UserStore 和 UserManager 的使用有什么区别?
【发布时间】:2015-07-09 06:48:56
【问题描述】:

我是 ASP.NET Identity 的新手,如果这个问题看起来很愚蠢,请多多包涵。

当我阅读下面链接中 Microsoft 网站上的 UserStoreUserManager 类的定义时,看起来这两个类都定义了围绕用户的操作(如添加、查找、删除和修改)。

那么我什么时候使用一个而不是另一个?

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

【问题讨论】:

  • 在领域驱动设计中 Usermanager 是 Application Layer ,它协调其他层 Action ,而 userStorer 是 Repository 层,它与 Database 交互,现在假设你想给用户发送短信,你不能使用 userStore ,因为它的职责只是做数据持久化相关的任务。但您可以使用 userManager 发送短信或其他操作。
  • 无需在您的问题前先道歉。如果您的问题已经被问过,它肯定会被标记为这样。一些 “最愚蠢” 的问题获得了最高票数:Stack Overflow: Helping One Million Developers Exit Vim

标签: c# asp.net-mvc asp.net-identity owin


【解决方案1】:

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

UserManger 是 ... 经理。它并不真正与存储、数据库交互。 这就是UserStore 所做的。

事实上,UserManager 有一个constructor,它需要一个 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; }

}

并且,也许,oververide 一些方法:

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 存储。调试非常容易。试一试,事情会在某个时候变得更清楚。

【讨论】:

  • 非常感谢,我对我的问题有了更清晰的理解。但是在您的类中,您将所有方法都放在 UserStore 类中。但根据 MS 网站,他们在 UserStore 和 UserManager 中有针对用户的操作方法。这些是不同的方法,但他们为什么不像你一样把所有的都放在 UserStore 或 UserManager 中呢?他们这样做的目的是什么?
  • 赞成一个比我瘦长的答案更清晰更简洁的答案。
  • @Adam:谢谢。赞赏。
  • @MinhNguyen:正如我所说,UserStore 存在是因为有些人想要实现他们的提供程序而不是 EF。它没有暴露。您不能自定义 UserManager 来更改数据的提供者。你简单的不行。您需要实现您的 UserStore。 UserStore 是 DDD 中的存储库。
  • 存储 = 存储库 / 管理器 = 服务
【解决方案2】:

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

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

对于那些它使用 UserStore 并对它说的东西,例如“嘿,UserStore,我有一个新用户需要保存以备将来使用,我不知道你将把它保存在哪里以及你现在的情况如何会做的,给我存起来”

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

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

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

【讨论】:

  • 你能分享教程的链接或名称吗?
  • 我不记得确切的视频了。你可以在Channel 9找到它
【解决方案3】:

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

区别?

UserStore&lt;T&gt; 对象被注入身份验证管理器,用于识别和验证UserStore&lt;T&gt; 身份。 UserManager&lt;T&gt; 引用充当UserStore&lt;T&gt; 身份的身份验证器。

重要细节

ASP.NET Identity 基于最新的开放式 Web 界面。这意味着[通常],Microsoft.Owin.Security:Linked here 中声明的 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);
}

我们可以注意到UserManager 身份验证管理器用于根据身份验证管理器的身份检查“UserStore”应用程序用户。 Snippet taken from blog.

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

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

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

【讨论】:

  • 它仍然让我感到困惑。这是我的理解:要实现对用户的操作,UserManager 是在 UserStore 对象上执行的。 UserStore 的主要目的是检索用户的集合。那么为什么我们不把所有的操作(方法)只留在 UseManager 类中呢? UserStore 和 UserManaer 中的方法(添加、删除...)有什么区别?
  • 类之间的方法不同?它们具有相同的名称,但一个添加或删除对用户的声明,另一个从身份验证“集合”中添加或删除用户声明
猜你喜欢
  • 1970-01-01
  • 2016-03-20
  • 1970-01-01
  • 2016-07-31
  • 2010-12-27
  • 1970-01-01
  • 1970-01-01
  • 2018-01-02
相关资源
最近更新 更多