我正试图在一个 ASP.NET Core
应用程序( RC2
库)中实现身份系统,并且有一个让我疯狂的特殊挂断 .
首先,我使用EntityFramework进行了 not . 我'm not even using SQL. I' m备份到 RavenDB ,所以我需要实现非常具体;这不是问题 .
所以我设计了一个 RavenUserStore
类,它看起来像这样;
public class RavenUserStore<TUser> :
IUserStore<TUser>,
IUserLoginStore<TUser>,
IUserPasswordStore<TUser>,
IUserRoleStore<TUser>,
IUserSecurityStampStore<TUser>,
IUserClaimStore<TUser>,
IUserLockoutStore<TUser>,
IUserTwoFactorStore<TUser>,
IUserEmailStore<TUser> {
// ...
}
独立工作 . 我已经实现了所有的方法,等等 . 太棒了 . 非常干净,高效 .
现在,我转到我的网络应用程序并连接起来;
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>
.
所以理论上..如果依赖注入通过构造函数注入时将 IUserStore<T>
的类型解析为 RavenUserStore<T>
..这不应该意味着 UserManager<T>
得到 RavenUserStore<T>
作为其Store属性吗?
我以为也会这样;但是当我在 UserManager
上调用方法时, DOES NOT 会调用 RavenUserStore
上的方法 . 为什么是这样?我能做什么?
我是否真的必须制作一个自定义的 UserManager
课程并重新执行所有这些方法?
1 回答
您需要在调用
services.AddIdentity()
之前添加自己的自定义提供程序 . 在内部,AddIdentity
使用TryAddScoped()
,如果服务容器中尚不存在默认项,则仅添加默认项 .因此,只需在注册所有自定义实现后调用
AddIdentity()
,就意味着它们将优先于您的预期 .