Как вы можете видеть в ссылках на исходные коды в комментариях к вашему ОП
FindByEmailAsync выполняет NormalizeKey , прежде чем он фактически начнет поиск пользователя.
email = NormalizeKey(email);
Это NormalizeKey(email)
выполняется UpperInvariantLookupNormalizer , который будет выполнять следующую строковую операцию с вашим письмом
return key.Normalize().ToUpperInvariant();
Теперь часть вашего кода, которая вызывает «странное» поведение, - это отсутствующий вызов нормализации в вашем коде при создании пользователя:
var appUsers = users.Select(x => new ApplicationUser
{
Email = x.email,
NormalizedEmail = x.email,
NormalizedUserName = x.email,
UserName = x.email,
EmailConfirmed = true,
Id = Guid.NewGuid().ToString(),
SecurityStamp = Guid.NewGuid().ToString()
}).ToArray();
Ненормализация электронного письма по-прежнему делает его обнаруживаемым через таблицу пользователей, поскольку это просто сравнивает NormalizedEmail
(который вы не нормализовали при создании пользователя) с ненормализованным электронным письмом, которое вы передаете в качестве аргумента:
_userManager.Users.FirstOrDefault(x => x.NormalizedEmail == email);
... однако userManager.FindByEmailAsync
нормализует сначала, а затем выполняет поиск ...
_userManager.FindByEmailAsync(email);
... и, следовательно, не найти пользователя.
Измените свой код на следующий:
// inject via using Microsoft.AspNetCore.Identity
protected ILookupNormalizer normalizer;
var appUsers = users.Select(x => new ApplicationUser
{
Email = x.email,
NormalizedEmail = normalizer.Normalize(x.email),
NormalizedUserName = normalizer.Normalize(x.email),
UserName = x.email,
EmailConfirmed = true,
Id = Guid.NewGuid().ToString(),
SecurityStamp = Guid.NewGuid().ToString()
}).ToArray();