【发布时间】:2021-06-07 22:51:26
【问题描述】:
我在 .Net Core 3.1 项目中使用 IdentityServer4 v4.1.1,但 FindByNameAsync 存在问题 - 它总是返回 null。
这有效并返回用户:
var user = await userStore.Context.Users.FirstOrDefaultAsync(u => u.NormalizedUserName == userManager.NormalizeName(model.Username), default(CancellationToken));
这不会并返回 null:
var user = await userStore.FindByNameAsync(userManager.NormalizeName(model.Username));
这怎么可能?
编辑(为了展示我的研究):
我对此感到非常困惑的原因是我在 .Net Core 源代码中找到了以下内容:https://github.com/dotnet/aspnetcore/blob/main/src/Identity/EntityFrameworkCore/src/UserStore.cs#L255
似乎这两个陈述都应该做同样的事情。我希望有人能解释为什么他们不这样做。
【问题讨论】:
-
您能否确认 u.NormalizedUserName 中提供的规范化名称与 FindByNameAsync 搜索的用户名相同?
-
是的,我确实用另一行替换了一行。
-
@Carson,我与 bbailes 合作,我可以确认用户名完全相同。我们已经使用第一个查询找到的用户来测试 FindByNameAsync 方法,它仍然无法找到用户。
-
明白了,我的问题与“NormalizedName” u.NormalizedUserName 一词返回的值有关,我想,您的架构中的一个字段。您确定 FindByNameAsync 函数正在搜索该列而不是其他列。由于我没有看到您的架构,因此我正在与您确认没有“NormalizedUserName”列和“用户名”列,其中搜索的数据可能是错误的字段。
-
@Carson,
UserName和NormalizedUserName都有。UserName全部小写,NormalizedUserName填充有userManager.NormalizeName(model.Username).我已经测试了这两列,包括规范化model.UserName以及在发送到FindByNameAsync之前不规范化它。 bbailes 还查看了 IdentityServer4 4.1.1 的源代码,它表明上面的两个查询应该是等效的,并且FindByNameAsync使用了NormalizedUserName列。