如何使用 ASP.NET 样板模板设置 TwoFactor 和 Lockout 设置?

How to set up TwoFactor and Lockout settings with ASP.NET Boilerplate templates?

我一直在使用 ASP.NET 样板作为我的应用程序的模板作为起点。我正在修改登录过程以实施 2FA。但是,我不确定将这些配置设置放在哪里。在之前使用 .NET MVC 和 .NET Identity 的应用程序中,我能够在继承 UserManager 的 class 中执行此操作 ApplicationUserManager。这就是我的配置方式:

public class ApplicationUserManager : UserManager<User>
{
    public ApplicationUserManager(IUserStore<User> store) : base(store)
    {
    }

    public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context)
    {
        var manager = new ApplicationUserManager(new UserStore<User>(context.Get<Db>()));
        // Configure validation logic for usernames
        manager.UserValidator = new UserValidator<User>(manager)
        {
            AllowOnlyAlphanumericUserNames = false,
            RequireUniqueEmail = true
        };
        // Configure user lockout defaults
        manager.UserLockoutEnabledByDefault = true;
        manager.MaxFailedAccessAttemptsBeforeLockout = 5;
        manager.DefaultAccountLockoutTimeSpan = TimeSpan.FromDays(365*500);

        manager.RegisterTwoFactorProvider("EmailCode", new EmailTokenProvider<User>()
        {
            Subject = "Security Code",
            BodyFormat = "Your security code is: {0}"
        });

        manager.EmailService = new EmailService();

        var dataProtectionProvider = options.DataProtectionProvider;
        if (dataProtectionProvider != null)
        {
            manager.UserTokenProvider = new DataProtectorTokenProvider<User>(dataProtectionProvider.Create("ASP.NET Identity"));
        }

        return manager;
    }
}

在ASP.NET Boilerplate 中,有很多强大的工具和许多接口可以用来协助登录过程。我看到 GitHub post 其中讨论了 disable lockout feature,看起来我应该能够为 MaxFailedAccessAttempts 添加到我的 SettingsManager 数据库选项,并且DefaultLockoutTimeSpan,但我不确定将它们添加到数据库后是否会自动神奇地提取它们,特别是如果我没有正确命名它们。我可以在这里使用 EmailSettings 的 class 常量值:

public void Create()
{
    // Emailing
    AddSettingIfNotExists(EmailSettingNames.DefaultFromAddress, "developer@developer.com");
    AddSettingIfNotExists(EmailSettingNames.DefaultFromDisplayName, "do not reply");
    AddSettingIfNotExists(EmailSettingNames.Smtp.Host, "smtp.gmail.com");
    AddSettingIfNotExists(EmailSettingNames.Smtp.Port, "587");
    AddSettingIfNotExists(EmailSettingNames.Smtp.UserName, "developer@developer.com");
    AddSettingIfNotExists(EmailSettingNames.Smtp.Password, "SomePassword");
    AddSettingIfNotExists(EmailSettingNames.Smtp.EnableSsl, "true");
    AddSettingIfNotExists(EmailSettingNames.Smtp.UseDefaultCredentials, "false");

    // Languages
    AddSettingIfNotExists(LocalizationSettingNames.DefaultLanguage, "en");
}

Core 项目中还有一个 class — AppSettingNames,其中包含 UiTheme 的值。我想我可以在那里添加常量值。但是,如果我这样做,我是否需要将这些设置命名为与 UserManager 属性正在寻找的名称相同?

相关常量在AbpZeroSettingNames.

// DefaultLockoutTimeSpan
AddSettingIfNotExists(
    AbpZeroSettingNames.UserManagement.UserLockOut.DefaultAccountLockoutSeconds,
    int.MaxValue.ToString() // 2,147,483,647 seconds, just over 68 years
);

// MaxFailedAccessAttempts
AddSettingIfNotExists(
    AbpZeroSettingNames.UserManagement.UserLockOut.MaxFailedAccessAttemptsBeforeLockout,
    "5"
);

不幸的是,int.MaxValue in seconds 只允许应用程序一次将用户锁定超过 68 年,比您过去配置的 500 年还要少。