【发布时间】:2016-07-31 01:16:41
【问题描述】:
我正在尝试在 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> {
// ...
}
单独使用效果很好。我已经实现了所有的方法,等等。太棒了。非常干净高效。
现在,我转到我的 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> 的一种类型。
理论上.. 如果依赖注入将IUserStore<T> 的类型通过构造函数注入时解析为RavenUserStore<T>.. 这不应该意味着UserManager<T> 将RavenUserStore<T> 作为其Store 属性吗?
我也认为会的;但是当我调用UserManager 上的方法时,它不会调用我RavenUserStore 上的方法。为什么是这样?我能做什么?
我真的需要创建一个自定义 UserManager 类并再次执行所有这些方法吗?
【问题讨论】:
-
尝试将您的用户存储的 AddTransient 更改为 AddScoped,我认为大多数身份对象都是按请求限定的,所以您的也应该如此
-
我很有希望,但没有——那没有用。 :(
-
您可能会通过我的cloudscribe project 获得一些想法,我正在工作的多租户身份实现可以使用 EF,但数据层是从身份位中抽象出来的。特别感兴趣的可能是 example.Webapp 项目中的 3 个启动类,我在其中连接服务和配置中间件。我认为您所有的自定义 services.Add 应该在 .AddIdentity 之前,并且所有内容都应该根据请求进行限定。好像您正在更新密码哈希而不是注入它。
-
谢谢!我去看看。
-
它无法编译,因为项目的其他部分需要一些东西,但我把与身份系统相关的东西做了一个存储库,以便您可以更好地查看它。我现在必须去某个地方,但是当我回来时,如有必要,我会尝试更多地清理它:github.com/ciel/sunfire-stackoverflow
标签: asp.net asp.net-identity asp.net-core