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

Cie*_*iel 8 asp.net asp.net-identity asp.net-core

我正在尝试在ASP.NET Core应用程序(RC2库)中实现身份系统,并且有一个特别的挂断让我发疯.

首先,我没有使用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> {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

独立工作.我已经实现了所有的方法,等等.太棒了.非常干净,高效.

现在,我转到我的网络应用程序并连接起来;

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>>();
Run Code Online (Sandbox Code Playgroud)

因此,根据我所见过的所有示例,以及来自Identity Framework Github存储库的核心示例,我将制作一个控制器来使用它.

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

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

UserManager<T>有一个属性Store,这是一种类型IUserStore<T>.

所以理论上..如果依赖注入解析类型IUserStore<T>来RavenUserStore<T>时他们是通过构造函数注入..应该不是意味着UserManager<T>得到一个RavenUserStore<T>作为其存储性能?

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

我是否真的必须制作一个自定义UserManager类并重新执行所有这些方法?

Tim*_*ong 1

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

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