ASP.NET核心标识-UserManager和UserStore问题



我正试图在ASP.NET Core应用程序(RC2库)中实现Identity系统,但有一个特殊的问题让我抓狂。

首先,我不是使用EntityFramework。我甚至没有使用SQL。我正在备份RavenDB,所以我需要实现非常具体;这不是问题。

所以我设计了一个RavenUserStore类,它看起来是这样的;

public class RavenUserStore<TUser> :
        IUserStore<TUser>,
        IUserLoginStore<TUser>,
        IUserPasswordStore<TUser>,
        IUserRoleStore<TUser>,
        IUserSecurityStampStore<TUser>,
        IUserClaimStore<TUser>,
        IUserLockoutStore<TUser>,
        IUserTwoFactorStore<TUser>,
        IUserEmailStore<TUser> {
    // ...
}

它本身就很好。我已经实现了所有的方法等等。这太棒了。非常干净高效。

现在,我转到我的web应用程序并将其连接起来;

services.AddTransient<ILookupNormalizer>(s => new LowerInvariantLookupNormalizer());
services.AddTransient<IPasswordHasher<Member>>(s => new PasswordHasher<Member>());
services.AddTransient<IUserStore<Member>, RavenUserStore<Member>>();
services.AddIdentity<Member, Role>(o => {
    o.Password.RequiredLength = 6;
    o.Password.RequireDigit = true;
    o.Password.RequireLowercase = false;
    o.Password.RequireUppercase = false;
})
.AddUserStore<RavenUserStore<Member>>()
.AddRoleStore<RavenRoleStore<Role>>();

因此,根据我看到的所有样本,以及Identity Framework Github Repository 中的核心样本,我制作了一个控制器来使用它

//... [PROPERTIES]...//
public AccountController(UserManager<Member> userManager, SignInManager<Member> signInManager) {
    // ... [attach constructor parameters to properties] ...//
}

好的,所以我仔细检查了课程。

UserManager<T>具有属性Store,该属性是IUserStore<T>的一种类型。

所以理论上。。如果依赖注入在通过构造函数注入CCD_ 7到CCD_。。这难道不意味着UserManager<T>得到一个RavenUserStore<T>作为它的Store属性吗?

我以为它也会;但是当我调用UserManager上的方法时,它不会调用我的RavenUserStore上的方法。为什么会这样?我能做什么?

我真的必须制作一个自定义的UserManager类并再次执行所有这些方法吗?

在调用services.AddIdentity()之前,您需要添加自己的自定义提供程序。在内部,AddIdentity使用TryAddScoped(),它只在服务容器中不存在默认项的情况下添加默认项。

因此,在注册了所有自定义实现之后,只需调用AddIdentity(),就意味着它们将如您所期望的那样具有优先级。

相关内容

  • 没有找到相关文章

最新更新