首页 文章

ASP.NET核心身份 - UserManager和UserStore的困境

提问于
浏览
8

我正试图在一个 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 回答

  • 1

    您需要在调用 services.AddIdentity() 之前添加自己的自定义提供程序 . 在内部, AddIdentity 使用 TryAddScoped() ,如果服务容器中尚不存在默认项,则仅添加默认项 .

    因此,只需在注册所有自定义实现后调用 AddIdentity() ,就意味着它们将优先于您的预期 .

相关问题