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

时间:2015-07-09 06:48:57

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

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

3 个答案:

答案 0 :(得分:38)

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

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; }

}

并且,或许,可能有些方法:

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存储。它很容易调试。试一试,事情会更清楚。

答案 1 :(得分:3)

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

<强>差分吗

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

重要细节

ASP.NET Identity基于最新的Open Web Interface。这意味着[通常],Microsoft.Owin.SecurityLinked here中声明的IAuthenticationManager接口,注册到UserManager类和控制器的验证器以及基本上涉及验证步骤的每个操作。 / p>

以下内容:

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

我们可以注意到UserManager身份验证管理器用于检查&#34; UserStore&#34;应用程序用户违反身份验证管理器的身份。 Snippet taken from blog.

<强>结论 UserManager本质上是ASP.NET标识的域逻辑。您用来处理&#34;登录&#34;或&#34;识别&#34;由UserStore传递,MSDN: Userstore描述......

  

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

一旦UserStore将所有必填字段限定为身份并且您已将UserManager限定为身份验证管理器,并且存储上下文的方法... aka {{1}或者在SQL中存储值的其他一些方法(如果使用的话),你将拥有一个能够支持登录的Identity系统。

答案 2 :(得分:2)

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

Managers vs Stores

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

对于那些它使用UserStore的东西并对它说例如#34;嘿UserStore我有一个新的用户需要保存以备将来使用,我不知道你要去哪里保存它以及你将如何做到这一点,只需为我保存&#34;

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

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

对于RoleManager和RoleStore,同样的概念也是如此。