如何使用 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 年还要少。
我一直在使用 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 年还要少。