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

时间:2016-04-09 20:22:10

标签: asp.net asp.net-identity asp.net-core

我正在尝试在.summary, .bio, .http, .terms, .citation { width:75%; min-width: 812px; margin:auto; margin-top: 1em; margin-bottom: 3em; display: flex; color: #585858;} .summary { flex-direction: row;} .bio, .terms, .citation { flex-direction: column;} figure{ display: flex;} app(ASP.NET Core库)中实现身份系统,并且有一个让我疯狂的特殊挂断。

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

所以我设计了一个RC2类,它看起来像这样;

RavenUserStore

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

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

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

所以我按照我见过的所有样本制作一个控制器来使用它,以及来自Identity Framework Github Repository的核心样本

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>>();

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

//... [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> 1}}作为Store属性?

我以为也会这样;但是当我在RavenUserStore<T>上调用方法时,不会调用UserManager上的方法。为什么是这样?我该怎么办?

我是否真的必须制作自定义RavenUserStore课程并重新执行所有这些方法?

1 个答案:

答案 0 :(得分:1)

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

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