【问题标题】:ASP.NET Core Identity - UserManager and UserStore woesASP.NET Core 身份 - UserManager 和 UserStore 问题
【发布时间】: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&lt;T&gt; 有一个属性Store,它是IUserStore&lt;T&gt; 的一种类型。

理论上.. 如果依赖注入将IUserStore&lt;T&gt; 的类型通过构造函数注入时解析为RavenUserStore&lt;T&gt;.. 这不应该意味着UserManager&lt;T&gt;RavenUserStore&lt;T&gt; 作为其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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-28
    • 2021-02-11
    • 2021-04-12
    • 2020-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多