我正试图在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()
,就意味着它们将如您所期望的那样具有优先级。