Есть ли способ уточнить, какое действие будет проверяться ...?
Нет контекста для вызова на ValidateUser
, кроме User
само по себе, что означает, что нет реального способа точно узнать , почему он вызывается.
UserManager
содержит метод protected
(ValidateAsync
), которыйвызывается внутри системы всякий раз, когда вызывается UserManager.CreateAsync
или UserManager.UpdateUserAsync
.Вызов AddToRoleAsync
приводит к вызову UpdateUserAsync
, который заканчивается ValidateAsync
выполнением реализаций IUserValidator<TUser>
для выполнения проверки.
Реализация встроенного UserValidator<TUser>
, который вы заменили, обрабатывает вашу проблему с помощью следующей проверки ( source ):
var owner = await manager.FindByEmailAsync(email);
if (owner != null &&
!string.Equals(await manager.GetUserIdAsync(owner), await manager.GetUserIdAsync(user)))
{
errors.Add(Describer.DuplicateEmail(email));
}
Сначала он проверяет, существует ли существующая учетная запись сэтот адрес электронной почты, а затем проверяет, совпадает ли эта учетная запись с проверяемой.Если это то же самое, это не дубликат.
Все это означает, что вы должны иметь возможность расширить проверку для выполнения аналогичной логики.Например:
var existingAccount = await _unitOfWork.AuthUsers.Get().FirstOrDefaultAsync(u =>
u.NormalizedEmail == user.Email.ToUpper() &&
!u.IsDeleted &&
u.Id != user.Id);
Здесь я добавил u.Id != user.Id
, что намного меньше, чем встроенная реализация, так как ваш код знает, что он работает с UserAuth
и может напрямую использовать его свойства.