【问题标题】:Core aspnet identity password validator based on the configuration基于配置的核心 aspnet 身份密码验证器
【发布时间】:2017-08-14 23:54:13
【问题描述】:
 public static IdentityBuilder AddCustomPasswordValidator<TUser>(this IdentityBuilder builder, PasswordValidateOptions options) where TUser : class
    {

        if (!options.EmailInPassword)
            builder.AddPasswordValidator<EmailInPasswordValidator>();
        if (!options.UserNameInPassword)
            builder.AddPasswordValidator<UserNameInPasswordValidator>();
        if (!options.LastPasswordsInPassword)
            builder.AddPasswordValidator<LastPasswordsInPasswordValidator>();      
        return builder ;

    }

在上述方法中,我无法通过 prop 或构造函数将参数传递给 IPasswordvalidator 实现。

比如LastPasswordValidator,我想根据编号来配置。来自选项的密码计数,但 AddPasswordValidator 不获取任何数据。

public class LastPasswordsInPasswordValidator:IPasswordValidator<ApplicationUser>
{



    private int LastPasswordsCount { get; set; }

    public LastPasswordsInPasswordValidator(IPasswordHasher<ApplicationUser> passwordHasher)
    {
        this.passwordHasher = passwordHasher;
    }
}

这就是我想要的

 builder.AddPasswordValidator<LastPasswordsInPasswordValidator>(options);    

但 AddPasswordValidator 没有过载。!!!

【问题讨论】:

  • 您是否尝试将选项作为依赖项注入您的验证器构造函数?
  • @Brad,确实尝试过,但它是一样的。我想我将不得不重写 IdentityBuilder.AddPasswordValidator 方法以在构造函数中接受带有参数的泛型类型。我真的不确定,因为它是 Identity 基类。[ private PasswordValidateOptions PasswordValidateOptions { get;放; } 公共 LastPasswordsInPasswordValidator(IOptions 选项) { this.PasswordValidateOptions = options.Value; }]
  • 它更像是,如何将数据与类型一起传递!!
  • 您可以为AddPasswordValidator 创建自己的重载,因为它只是一种扩展方法。您是否在启动时使用 services.Configure&lt;PasswordValidationOptions&gt;() 将选项添加到您的服务?
  • @Brad,是的,我正在添加配置。我添加了多个扩展方法,但是这个我不知道 AddPasswordValidator 的实现。我也想将选项数据传递给 LastPasswordsInPasswordValidator。

标签: .net c#-4.0 dependency-injection asp.net-core


【解决方案1】:

启动配置服务。

Ioptions 模式让生活更轻松,++Core 设计模式 当我们需要跨应用程序的数据时,无需通过属性/构造函数传递数据,Ioptions 为您保留它

 services.Configure<PasswordValidateOptions>(Configuration.GetSection("PasswordValidateOptions"));

IpasswordValidator的实现

private PasswordValidateOptions PasswordValidateOptions { get; set; }
        public LastPasswordsInPasswordValidator(IOptions<PasswordValidateOptions> options)
        {
            this.PasswordValidateOptions = options.Value;
        }

【讨论】:

  • 所以你按照我的 cmets 建议实施,你说没有用。很有趣。
  • @Brad,这个建议很棒,是的,确实尝试过,但由于代码中的其他一些依赖性而没有奏效,因为我从不同的角度看待问题以解决这让我转变重点。当我重新访问核心 Ioptions 模式时,我发现并理解我错过了基本点。但重回正轨。你的建议对我有用
猜你喜欢
  • 1970-01-01
  • 2017-05-23
  • 2017-09-13
  • 2016-04-19
  • 1970-01-01
  • 1970-01-01
  • 2017-11-26
  • 2018-05-12
  • 2020-07-17
相关资源
最近更新 更多