如何在验证用户身份时验证任意条件



假设我有一个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>的任何地方。

最新更新