Helloes,
I have a .NetCore MVC APP with Identity and using this guide I was able to create custom user validators.
public class UserDomainValidator&l
Answer for those who just want to extend existing default user validation, without the risk of breaking something.
You can use the Decorator pattern and instead of copying/changing default UserValidator you can just perform additional validation of the user data. Here is an example:
public class UserValidatorDecorator : IUserValidator where TUser : ApplicationUser
{
// Default UserValidator
private readonly UserValidator _userValidator;
// Some class with additional options
private readonly AdditionalOptions _additionalOptions;
// You can use default error describer or create your own
private readonly IdentityErrorDescriber _errorDescriber;
public UserValidatorDecorator(UserValidator userValidator,
AdditionalOptions additionalOptions,
IdentityErrorDescriber errorDescriber)
{
_userValidator = userValidator;
_additionalOptions = additionalOptions;
_errorDescriber = errorDescriber;
}
public async Task ValidateAsync(UserManager manager,
TUser user)
{
// call to default validator
var identityResult = await _userValidator.ValidateAsync(manager, user);
// if default validation is already failed you can just return result, otherwise call
// your additional validation method
return identityResult.Succeeded ?
AdditionalValidation(user) :
identityResult;
}
public IdentityResult AdditionalUserNameValidation(TUser user)
{
// now you can check any value, if you need you can pass to method
// UserManager as well
var someValue = user.SomeValue;
if (someValue < _additionalOptions.MaximumValue)
{
return IdentityResult.Failed(_errorDescriber.SomeError(userName));
}
return IdentityResult.Success;
}
}
And then you need to register your decorator, it depends on version of .NET framework, I use such code for .NET Core 3.0:
// First register default UserValidator and your options class
services.AddScoped>();
services.AddScoped();
// Then register Asp Identity and your decorator class by using AddUserValidator method
services.AddIdentity()
.AddEntityFrameworkStores()
.AddUserValidator>();