ASP.NET Core Identity - pravidla pro tvorbu hesla

ASP.NET Core Identity slouží pro správu uživatelů, identity a rolí ve vaší ASP.NET aplikaci. Systém nabízí základní sadu pravidel, které je možné nastavit v IdentityOptions. Základní pravidla pro se nachází v PasswordOptions - minimální délka hesla, povolené znaky, musí obsahovat číslo,…

Tyto pravidla můžeme upravovat přímo u registrace ASP.NET Core Identity.

services.AddIdentity<User, Role>(options => 
{
    options.Password.RequiredLength = 10;
    ...
});

Pravidla potom zpracovávají tzv. validátory. Pro validaci hesla systém nabízí defaulní implementaci PasswordValidator<TUser>, kde se tyhle pravidla aplikují.

Pokud potřebujete pravidlo pro validování hesla, které identity systém nenabízí, můžete využít interface IPasswordValidator<TUser> a naimplementovat si vlastní pravidlo.

Příklad - chceme mít validaci pro heslo, které zakáže, aby heslo bylo stejné jako username.

public class UserNamePasswordValidator : IPasswordValidator<User>
{
    public Task<IdentityResult> ValidateAsync(UserManager<User> manager, User user, string password)
    {
        if (password.Contains(user.UserName, System.StringComparison.OrdinalIgnoreCase))
        {
            return Task.FromResult(IdentityResult.Failed(new IdentityError
            {
                Code = "UserNameInPassword",
                Description = "Password cannot contain the username"
            }));
        }

        return Task.FromResult(IdentityResult.Success);
    }
}

Následně validátor musíme zaregistrovat do identity pipeline.

services.AddIdentity<User, Role>()
        .AddPasswordValidator<UserNamePasswordValidator>();

Potom všechny validátory jsou uloženy ve tříde UserManager v kolekci PasswordValidators.

Použití:

...
var validators = _userManager.PasswordValidators;
            
foreach (var validator in validators)
{
    var result = await validator.ValidateAsync(_userManager, user, password);
    ...
}
...

Pomocí validátoru můžete uživateli dát okamžitou zpětnou vazbu pokud heslo není validní, a nemusíte čekat až na pokus uložení do DB.

Written on August 3, 2019