【问题标题】:Password History for ASP.net Core 2.0ASP.net Core 2.0 的密码历史记录
【发布时间】:2017-09-06 18:25:41
【问题描述】:

我的一个要求是检查过去一年的最后 5 个密码历史条目,以确保客户没有重复使用密码。

我已经在我的用户实体上创建了密码实体和密码集合。

我需要创建一个继承自 UserManager<TUser> 的自定义用户管理器,并覆盖添加/更新密码以填充历史记录的方法。我还必须创建一个继承 PasswordValidator<TUser> 并覆盖 ValidateAsync 方法的自定义密码验证器。

如何在 .Net Core 2.0 中注册这些自定义实现?您是否必须用所有单独的依赖注入调用替换 services.AddIdentity 助手?或者有没有办法只覆盖UserManagerPasswordValidator 部分?

【问题讨论】:

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


    【解决方案1】:

    您可以将默认注册的服务替换为 AddIdentity() 调用,只需在它们之上注册您的服务即可。依赖注入容器将保留所有个注册,但是当服务请求一个实例时,它只会使用一个类型的最新注册。因此,您只需要确保以完全相同的方式注册您的服务,即注册原始服务。所以有疑问,check the implementation 看看哪些服务是如何注册的。

    在你的情况下,你可能想做这样的事情:

    services.AddIdentity<MyUser, MyRole>();
    services.AddScoped<UserManager<MyUser>, CustomUserManager>();
    services.AddScoped<IPasswordValidator<MyUser>, CustomPasswordValidator>();
    

    【讨论】:

    • 有趣...在查看实现时,我注意到他们使用services.TryAddTransient。根据 Intellisense 的说法,这只会在尚未注册的情况下注册服务类型。所以现在我想知道最好在致电AddIdentity() 之前或之后注册它。将尝试两者并发布结果。谢谢!
    • 确实,由于使用了TryAddScopedTryAddTransient,我可以在调用AddIdentity 之前添加我的自定义实现。
    • 很高兴知道!感谢您的反馈:)
    【解决方案2】:

    另一个适用于您的情况并且可以在多种其他情况下工作的想法是寻找一种方法,让您可以添加不同的功能以及身份。

    例如:

      services.AddIdentity<User, IdentityRole>()
                    .AddUserManager<UserManager>()
                    .AddDefaultTokenProviders();
    

    用于指定不同的UserManager 实现。

    在您的情况下,您可以使用AddPasswordValidator 方法:

    services.AddIdentity<User, IdentityRole>(options =>
    {
        options.Password.RequireDigit = true;
        options.Password.RequireLowercase = true;
        options.Password.RequireNonLetterOrDigit = true;
        options.Password.RequireUppercase = true;
        options.Password.RequiredLength = 6;
    })
    .AddDefaultTokenProviders()
    .AddPasswordValidator<SameCharacterPasswordValidator<User>>();
    

    身份框架将为您完成所有 DI 工作:

     public virtual IdentityBuilder AddPasswordValidator<TUser>() where TUser : class
     {
        return this.AddScoped(typeof (IPasswordValidator<>).MakeGenericType(this.UserType), typeof (TUser));
     }
    

    【讨论】:

      猜你喜欢
      • 2014-11-14
      • 2019-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-19
      相关资源
      最近更新 更多