web-dev-qa-db-ja.com

ASP.NET Core Identityのパスワードポリシーをオーバーライドする方法

既定では、ASP.NET Core Identityのパスワードポリシーには、少なくとも1つの特殊文字、1つの大文字、1つの数字、...が必要です。

この制限を変更するにはどうすればよいですか?

ドキュメントにはそれについて何もありません( https://docs.asp.net/en/latest/security/authentication/identity.html

Identityのユーザーマネージャーをオーバーライドしようとしましたが、パスワードポリシーを管理する方法がわかりません。

public class ApplicationUserManager : UserManager<ApplicationUser>
{
    public ApplicationUserManager(
        DbContextOptions<SecurityDbContext> options,
        IServiceProvider services,
        IHttpContextAccessor contextAccessor,
        ILogger<UserManager<ApplicationUser>> logger)
        : base(
              new UserStore<ApplicationUser>(new SecurityDbContext(contextAccessor)),
              new CustomOptions(),
              new PasswordHasher<ApplicationUser>(),
              new UserValidator<ApplicationUser>[] { new UserValidator<ApplicationUser>() },
              new PasswordValidator[] { new PasswordValidator() },
              new UpperInvariantLookupNormalizer(),
              new IdentityErrorDescriber(),
              services,
              logger
            // , contextAccessor
              )
    {
    }

    public class PasswordValidator : IPasswordValidator<ApplicationUser>
    {
        public Task<IdentityResult> ValidateAsync(UserManager<ApplicationUser> manager, ApplicationUser user, string password)
        {
            return Task.Run(() =>
            {
                if (password.Length >= 4) return IdentityResult.Success;
                else { return IdentityResult.Failed(new IdentityError { Code = "SHORTPASSWORD", Description = "Password too short" }); }
            });
        }
    }

    public class CustomOptions : IOptions<IdentityOptions>
    {
        public IdentityOptions Value { get; private set; }
        public CustomOptions()
        {
            Value = new IdentityOptions
            {
                ClaimsIdentity = new ClaimsIdentityOptions(),
                Cookies = new IdentityCookieOptions(),
                Lockout = new LockoutOptions(),
                Password = null,
                User = new UserOptions(),
                SignIn = new SignInOptions(),
                Tokens = new TokenOptions()
            };
        }
    }
}

このユーザーマネージャーの依存関係をスタートアップのクラスに追加します。

services.AddScoped<ApplicationUserManager>();

しかし、コントローラーでApplicationUserManagerを使用すると、次のエラーが発生します。リクエストの処理中に未処理の例外が発生しました。

InvalidOperationException:「ApplicationUserManager」をアクティブ化しようとしているときに、「Microsoft.EntityFrameworkCore.DbContextOptions`1 [SecurityDbContext]」タイプのサービスを解決できません。

EDIT:ASP.NET Core Identityのデフォルトクラスを使用するとユーザーの管理が機能するため、データベースの問題などではありません

EDIT 2:ソリューションが見つかりました。スタートアップのクラスでIdentityを設定するだけです。私の答えはいくつかの詳細を与えます。

42
AdrienTorris

最終的にすっごくシンプルです...

クラスをオーバーライドする必要はありません。次のように、スタートアップクラスでID設定を構成するだけです。

services.Configure<IdentityOptions>(options =>
{
    options.Password.RequireDigit = false;
    options.Password.RequiredLength = 5;
    options.Password.RequireLowercase = true;
    options.Password.RequireNonLetterOrDigit = true;
    options.Password.RequireUppercase = false;
});

または、追加時にIDを構成できます。

services.AddIdentity<ApplicationUser, IdentityRole>(options=> {
                options.Password.RequireDigit = false;
                options.Password.RequiredLength = 4;
                options.Password.RequireNonAlphanumeric = false;
                options.Password.RequireUppercase = false;
                options.Password.RequireLowercase = false;
            })
                .AddEntityFrameworkStores<SecurityDbContext>()
                .AddDefaultTokenProviders();

AS.NET Coreは間違いなく優れたものです...

108
AdrienTorris

IdentityConfig.csファイルでこれらのルールを変更できます。ルールはで定義されます

public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context)
{
    var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(context.Get<ApplicationDbContext>()));
    // Configure validation logic for usernames
    manager.UserValidator = new UserValidator<ApplicationUser>(manager)
    {
        AllowOnlyAlphanumericUserNames = false,
        RequireUniqueEmail = true
    };

    // Configure validation logic for passwords
    manager.PasswordValidator = new PasswordValidator
    {
        RequiredLength = 5,
        RequireNonLetterOrDigit = false,
        RequireDigit = true,
        RequireLowercase = true,
        RequireUppercase = true,
    };
}
4
Shashi Bhat