【发布时间】:2018-06-10 17:40:49
【问题描述】:
我正在自定义用户名验证以允许相同的用户名(非唯一)。这是一个附加字段“已删除”,作为对身份用户的软删除。因此自定义涉及更改当前验证以检查用户名是否已存在并且已删除为 false 以仅触发 DuplicateUserName 错误。
我所做的是创建一个 CustomUserValidator 类,并覆盖 UserValidator.cs 中的 ValidateAsync 方法以及 ValidateUserName 方法。下面是代码:
CustomUserValidator.cs
public class CustomUserValidator<TUser> : UserValidator<TUser>
where TUser : ApplicationUser
{
public override async Task<IdentityResult> ValidateAsync(UserManager<TUser> manager, TUser user)
{
if (manager == null)
{
throw new ArgumentNullException(nameof(manager));
}
if (user == null)
{
throw new ArgumentNullException(nameof(user));
}
var errors = new List<IdentityError>();
await ValidateUserName(manager, user, errors);
if (manager.Options.User.RequireUniqueEmail)
{
await ValidateEmail(manager, user, errors);
}
return errors.Count > 0 ? IdentityResult.Failed(errors.ToArray()) : IdentityResult.Success;
}
private async Task ValidateUserName(UserManager<TUser> manager, TUser user, ICollection<IdentityError> errors)
{
var userName = await manager.GetUserNameAsync(user);
if (string.IsNullOrWhiteSpace(userName))
{
errors.Add(Describer.InvalidUserName(userName));
}
else if (!string.IsNullOrEmpty(manager.Options.User.AllowedUserNameCharacters) &&
userName.Any(c => !manager.Options.User.AllowedUserNameCharacters.Contains(c)))
{
errors.Add(Describer.InvalidUserName(userName));
}
else
{
//var owner = await manager.FindByNameAsync(userName);
var owner = manager.Users.Where(x => !x.Deleted &&
x.UserName.ToUpper() == userName.ToUpper())
.FirstOrDefault();
if (owner != null &&
!string.Equals(await manager.GetUserIdAsync(owner), await manager.GetUserIdAsync(user)))
{
errors.Add(Describer.DuplicateUserName(userName));
}
}
}
}
在 Startup.cs 中
public void ConfigureServices(IServiceCollection services)
{
services.AddTransient<IUserValidator<ApplicationUser>, CustomUserValidator<ApplicationUser>>();
}
CustomUserValidator 中的 ValidateAsync 方法中的代码工作正常,但似乎原始 ValidateAsync 也在运行。我之所以这么说是因为:
- 调试时,DuplicateUserName() 没有被调用,但仍然收到重复用户名错误。
- 通过放置特殊字符测试其他用户名验证。验证失败,特殊字符不允许出现两次错误!
我在这里做错了什么或错过了什么? 提前致谢。
【问题讨论】:
标签: validation asp.net-core-mvc asp.net-identity