Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# UserManager.FindByEmailAsync返回null,但该用户存在于数据库中_C#_Asp.net Core_Asp.net Core Identity - Fatal编程技术网

C# UserManager.FindByEmailAsync返回null,但该用户存在于数据库中

C# UserManager.FindByEmailAsync返回null,但该用户存在于数据库中,c#,asp.net-core,asp.net-core-identity,C#,Asp.net Core,Asp.net Core Identity,UserManager.findbyemailsync返回null,但该用户存在于数据库中 下面的代码解释了这个奇怪的问题: var email = info.Principal.FindFirstValue(ClaimTypes.Email); var test = new Data.ApplicationDbContext().Users.First(x => x.NormalizedEmail == email); var usermail = await _userManager.

UserManager.findbyemailsync
返回
null
,但该用户存在于数据库中

下面的代码解释了这个奇怪的问题:

var email = info.Principal.FindFirstValue(ClaimTypes.Email);
var test = new Data.ApplicationDbContext().Users.First(x => x.NormalizedEmail == email);
var usermail = await _userManager.FindByEmailAsync(email);

Console.WriteLine(test == null);      //false
Console.WriteLine(usermail == null);  //true
编辑 同样通过
\u userManager
本身,可以获得所需的用户:

var test = _userManager.Users.FirstOrDefault(x => x.NormalizedEmail == email);
var usermail = await _userManager.FindByEmailAsync(email);

Console.WriteLine(test == null);      //false
Console.WriteLine(usermail == null);  //true
应该注意的是,用户不是以“常规”方式创建的,而是通过数据种子(在
OnModelCreating
中)创建的:

模型创建时受保护的覆盖无效(ModelBuilder)
{
var users=new(字符串电子邮件,字符串名称)[]{
("xyz@gmail.com“,”管理“)
};
var appUsers=users。选择(x=>newapplicationuser
{
Email=x.Email,
NormalizedEmail=x.email,
NormalizedUserName=x.email,
用户名=x.email,
emailconfirm=true,
Id=Guid.NewGuid().ToString(),
SecurityStamp=Guid.NewGuid().ToString()
}).ToArray();
var role=newidentityrole(“管理员”){Id=Guid.NewGuid().ToString()};
var roleToUser=appUsers.Select(x=>newidentityUserRole{RoleId=role.Id,UserId=x.Id});
builder.Entity().HasData(appUsers);
builder.Entity().HasData(角色);
builder.Entity().HasData(roleToUser);
基于模型创建(生成器);
}

对于
NormalizedEmail
NormalizedUserName
,它应该是大写字母

试一试

var appUsers = users.Select(x => new ApplicationUser
{
    Email = x.email,
    NormalizedEmail = x.email.ToUpper(),
    NormalizedUserName = x.email.ToUpper(),
    UserName = x.email,
    EmailConfirmed = true,
    Id = Guid.NewGuid().ToString(),
    SecurityStamp = Guid.NewGuid().ToString()
}).ToArray();

对于
NormalizedEmail
NormalizedUserName
,它应该是大写字母

试一试

var appUsers = users.Select(x => new ApplicationUser
{
    Email = x.email,
    NormalizedEmail = x.email.ToUpper(),
    NormalizedUserName = x.email.ToUpper(),
    UserName = x.email,
    EmailConfirmed = true,
    Id = Guid.NewGuid().ToString(),
    SecurityStamp = Guid.NewGuid().ToString()
}).ToArray();

正如你在源代码链接中看到的,在我对你的OP的评论中 在实际开始搜索用户之前执行

email = NormalizeKey(email);
NormalizeKey(email)
由将对您的电子邮件执行以下字符串操作的完成

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();
不规范化电子邮件仍会使其通过用户表被发现,因为这只是将
规范化电子邮件
(创建用户时未进行规范化)与作为参数传递的未规范化电子邮件进行比较:

_userManager.Users.FirstOrDefault(x => x.NormalizedEmail == email);
…但是,
userManager.findbyemailsync
将首先启动它并执行搜索

_userManager.FindByEmailAsync(email);
…因此无法找到用户

email = NormalizeKey(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();

正如你在源代码链接中看到的,在我对你的OP的评论中 在实际开始搜索用户之前执行

email = NormalizeKey(email);
NormalizeKey(email)
由将对您的电子邮件执行以下字符串操作的完成

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();
不规范化电子邮件仍会使其通过用户表被发现,因为这只是将
规范化电子邮件
(创建用户时未进行规范化)与作为参数传递的未规范化电子邮件进行比较:

_userManager.Users.FirstOrDefault(x => x.NormalizedEmail == email);
…但是,
userManager.findbyemailsync
将首先启动它并执行搜索

_userManager.FindByEmailAsync(email);
…因此无法找到用户

email = NormalizeKey(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();

你没说你到底想要什么?你只是展示了一些代码,然后什么也没说@TanvirArjel你能指出标题和代码后缺少的信息吗?我希望
(wait\u userManager.findbyemailsync(email))==new Data.ApplicationDbContext().Users.First(x=>x.normalizedmail==email)
var email=info.Principal.FindFirstValue(ClaimTypes.email)
正在返回用于外部登录的电子邮件。那么,您是否已使用该电子邮件创建了一个用户?能否添加您的
ApplicationDbContext()
代码?我与您一样检查了调用
Users
集的UserManager。您的查询与UserStore所做的操作之间的唯一区别是在第行,但这一点可以忽略,因为FindByEmail为您返回
null
。您没有说您真正想要的是什么?你只是展示了一些代码,然后什么也没说@TanvirArjel你能指出标题和代码后缺少的信息吗?我希望
(wait\u userManager.findbyemailsync(email))==new Data.ApplicationDbContext().Users.First(x=>x.normalizedmail==email)
var email=info.Principal.FindFirstValue(ClaimTypes.email)
正在返回用于外部登录的电子邮件。那么,您是否已使用该电子邮件创建了一个用户?能否添加您的
ApplicationDbContext()
代码?我与您一样检查了调用
Users
集的UserManager。您的查询与UserStore所做的操作之间的唯一区别是第行,但这可以忽略,因为FindByEmail为您返回
null
。我不会在生产中使用它,因为它偏离了Identity标准化值的方式。简单地使用
ToUpper
是有问题的,因为它取决于哪些可能是大写的变体;还有一个电话找不到了。因此,
FindByEmailAsync
仍然不一定可以使用。我不会在生产中使用它,因为它偏离了Identity标准化值的方式。简单地使用
ToUpper
是有问题的,因为它取决于哪些可能是大写的变体;还有一个电话找不到了。因此,
findbyemailsync
仍然不一定可以使用。