ASP.NET 5で提供されるデフォルトのIDプロバイダーには、デフォルトで非常に厳しいパスワードルールがあり、小文字、大文字、英数字以外の文字、および数字が必要です。プロバイダーのパスワード要件を変更する方法を探しています。
以前のASP.NET 4では、プロバイダーはWeb.config XMLファイルを介して 以前に回答済み として構成できました。ただし、ASP.NET 5は新しいコードベースの構成パターンを使用しており、IDの構成方法が不明です。
アプリケーションのパスワード要件を変更するにはどうすればよいですか?
実際にこれを理解しましたが、AddDefaultIdentityに、提供するIdentityOptionsを構成する適切なラムダ式を指定する必要があることがわかりました。これは、Startupクラス内のConfigureServicesメソッド内で次のように実行されます。
public class Startup {
public void ConfigureServices(IServiceCollection services) {
// Add Identity services to the services container.
services.AddDefaultIdentity<ApplicationIdentityDbContext, ApplicationUser, IdentityRole>(Configuration,
o => {
o.Password.RequireDigit = false;
o.Password.RequireLowercase = false;
o.Password.RequireUppercase = false;
o.Password.RequireNonLetterOrDigit = false;
o.Password.RequiredLength = 7;
});
}
}
更新2:
上記は、フレームワークのbeta1バージョン、最新の rc1 beta5はわずかに変更されました:
services.AddIdentity<ApplicationUser, IdentityRole>(o => {
// configure identity options
o.Password.RequireDigit = false;
o.Password.RequireLowercase = false;
o.Password.RequireUppercase = false;
o.Password.RequireNonAlphanumeric = false;
o.Password.RequiredLength = 6;
})
.AddEntityFrameworkStores<ApplicationIdentityDbContext>()
.AddDefaultTokenProviders();
Individual User Accounts
を使用して新しいWebプロジェクトをセットアップした場合は、次の場所に移動します。
App_Start -> IdentityConfig.cs
そこで、次のデフォルトを編集できます。
manager.PasswordValidator = new PasswordValidator
{
RequiredLength = 6,
RequireNonLetterOrDigit = true,
RequireDigit = true,
RequireLowercase = true,
RequireUppercase = true,
};
startup.cs内:
services.AddIdentity<ApplicationUser, IdentityRole>(x =>
{
x.Password.RequiredLength = 6;
x.Password.RequireUppercase = false;
x.Password.RequireLowercase = false;
x.Password.RequireNonAlphanumeric = false;
}).AddEntityFrameworkStores<ApplicationDbContext>().AddDefaultTokenProviders();
私がやりたかったのは、パスワードルールをカスタマイズして、少なくとも次のグループのうち2つ:小文字、大文字、数字、特殊記号の文字が含まれるようにすることでした。
これは、PasswordValidatorオプションを変更するだけではできません。
manager.PasswordValidator = new PasswordValidator
{
RequiredLength = 6,
RequireNonLetterOrDigit = false,
RequireDigit = false,
RequireLowercase = false,
RequireUppercase = false,
};
その代わりに、IIdentityValidatorを拡張してカスタムバリデーターを作成しました...
最初に、Extensionsフォルダーに新しいファイルCustomPasswordValidator.csを作成します。
public class CustomPasswordValidator : IIdentityValidator<string>
{
public int RequiredLength { get; set; }
public CustomPasswordValidator(int length) {
RequiredLength = length;
}
/*
* logic to validate password: I am using regex to count how many
* types of characters exists in the password
*/
public Task<IdentityResult> ValidateAsync(string password) {
if (String.IsNullOrEmpty(password) || password.Length < RequiredLength)
{
return Task.FromResult(IdentityResult.Failed(
String.Format("Password should be at least {0} characters", RequiredLength)));
}
int counter = 0;
List<string> patterns = new List<string>();
patterns.Add(@"[a-z]"); // lowercase
patterns.Add(@"[A-Z]"); // uppercase
patterns.Add(@"[0-9]"); // digits
// don't forget to include white space in special symbols
patterns.Add(@"[!@#$%^&*\(\)_\+\-\={}<>,\.\|""'~`:;\\?\/\[\] ]"); // special symbols
// count type of different chars in password
foreach (string p in patterns)
{
if (Regex.IsMatch(password, p))
{
counter++;
}
}
if (counter < 2)
{
return Task.FromResult(IdentityResult.Failed(
"Please use characters from at least two of these groups: lowercase, uppercase, digits, special symbols"));
}
return Task.FromResult(IdentityResult.Success);
}
}
次に、IdentityConfig.csに移動し、Createメソッドで初期化します。
manager.PasswordValidator = new CustomPasswordValidator(6 /*min length*/);
/*
// You don't need this anymore
manager.PasswordValidator = new PasswordValidator
{
RequiredLength = 6,
RequireNonLetterOrDigit = true,
RequireDigit = true,
RequireLowercase = true,
RequireUppercase = true,
};
*/