假设我有一个ASP.NET MVC Core应用程序,并且我希望在允许身份验证时验证某些自定义条件。例如,一个用户提供了一对有效的凭据,但被应用程序的管理员禁用,或者一个标志指示用户是最新的付款,或者任何其他任意条件。ASP.NET Core Identity中是否有一个位置可以挂接此自定义验证?我必须使这项工作用于本地和外部身份验证。
对于您的情况,您可以创建自定义的用户验证器。
为ASP.NET Core Identity 编写自定义验证器
需要在@example.com中结束电子邮件地址的自定义用户验证器
这遵循Identity中的一个常见模式,在该模式中,您可以实现接口(在本例中为IValidator<T>
(并提供所有验证代码,也可以覆盖它的基本实现并通过覆盖方法添加额外的逻辑,就像我在这里所做的那样。
public class CustomUserValidator : UserValidator<ApplicationUser>
{
public override async Task<IdentityResult> ValidateAsync(UserManager<ApplicationUser> manager,
ApplicationUser user)
{
IdentityResult baseResult = await base.ValidateAsync(manager, user);
List<IdentityError> errors = new List<IdentityError>(baseResult.Errors);
if (!user.Email.EndsWith("@example.com"))
{
IdentityError invalidEmailError = Describer.InvalidEmail(user.Email);
invalidEmailError.Description += " Email address must end with @example.com";
errors.Add(invalidEmailError);
}
return errors.Count > 0 ? IdentityResult.Failed(errors.ToArray()) : IdentityResult.Success;
}
}
然后,要插入它,请转到Startup.cs文件并找到ConfigureServices
方法。在以services.AddIdentity
开头的行之前,添加以下行:
services.AddTransient<IUserValidator<ApplicationUser>, CustomUserValidator>();
这将把CustomUserValidator
的实现添加到内部服务集合中,允许它被注入到需要IUserValidator<ApplicationUser>
的任何地方。