.net core IdentityServer4 FindByNameAsync始终为空

.net core IdentityServer4 FindByNameAsync始终为空,.net-core,identityserver4,.net Core,Identityserver4,我在.Net Core 3.1项目中使用IdentityServer 4 v4.1.1,并且FindBynameAAsync存在问题-它总是返回null 这将工作并返回给用户: var user = await userStore.Context.Users.FirstOrDefaultAsync(u => u.NormalizedUserName == userManager.NormalizeName(model.Username), default(CancellationToken

我在.Net Core 3.1项目中使用IdentityServer 4 v4.1.1,并且FindBynameAAsync存在问题-它总是返回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核心源代码中发现了以下内容:

看起来这两种说法应该做完全相同的事情。我希望有人能解释他们为什么不这样做。

我与@bbales合作,我终于找到了答案

我们有一个名为
MultiTenantEntityUserStore
的类,我们使用该类重写一些内容以使应用程序成为多租户。不幸的是,这并不明显是在使用

其中,我们有一个属性:

public TTenantKey TenantId { get; set; }
public override IQueryable<TUser> Users => base.Users.Where(u => u.TenantId.Equals(TenantId));
这用于覆盖
用户
公共属性:

public TTenantKey TenantId { get; set; }
public override IQueryable<TUser> Users => base.Users.Where(u => u.TenantId.Equals(TenantId));
另一方面,这也使得
UserManager
SignInManager.UserManager
在使用相同的方法时能够正常工作。(如果您不知道,
UserManager
SignInManager.UserManager
是同一个对象。)这是因为
UserManager
使用
UserStore
访问
用户。当依赖项注入提供这些对象时,所有对象都正确地相互引用


看起来这个答案似乎只是针对我们的例子,但由于这堆问题中有同样多的未解决问题,这可能是一个普遍存在的问题,人们没有注意到,或者至少在解决问题后没有更新他们的问题。我可能读过至少12本没有答案的书。我想知道他们中有多少人有我们相同的问题。

我与@bbales合作,我终于找到了答案

我们有一个名为
MultiTenantEntityUserStore
的类,我们使用该类重写一些内容以使应用程序成为多租户。不幸的是,这并不明显是在使用

其中,我们有一个属性:

public TTenantKey TenantId { get; set; }
public override IQueryable<TUser> Users => base.Users.Where(u => u.TenantId.Equals(TenantId));
这用于覆盖
用户
公共属性:

public TTenantKey TenantId { get; set; }
public override IQueryable<TUser> Users => base.Users.Where(u => u.TenantId.Equals(TenantId));
另一方面,这也使得
UserManager
SignInManager.UserManager
在使用相同的方法时能够正常工作。(如果您不知道,
UserManager
SignInManager.UserManager
是同一个对象。)这是因为
UserManager
使用
UserStore
访问
用户。当依赖项注入提供这些对象时,所有对象都正确地相互引用


看起来这个答案似乎只是针对我们的例子,但由于这堆问题中有同样多的未解决问题,这可能是一个普遍存在的问题,人们没有注意到,或者至少在解决问题后没有更新他们的问题。我可能读过至少12本没有答案的书。我想知道他们中有多少人有相同的问题。

你能确认u.NormalizedUserName中提供的规范化名称与FindBynameAAsync搜索的用户名相同吗?是的,我确实用另一行替换了一行。@Carson,我使用的是bbailes,我可以确认用户名完全相同。我们使用第一个查询找到的用户来测试FindBynameSync方法,但它仍然无法找到该用户。请理解,我的问题与术语“NormalizedName”u返回的值有关。我认为NormalizedUserName将是架构中的一个字段。您确定FindByNameAsync函数正在搜索该列,而不是另一列吗。由于我看不到您的架构,我正在与您确认没有“NormalizedUserName”列和“Username”列,其中搜索的数据可能是错误的字段。@Carson,有一个
Username
NormalizedUserName
UserName
都是小写的,
NormalizedUserName
中填充了
userManager.NormalizeName(model.UserName)。
我已经测试了这两个列,包括规范化
model.UserName
以及在将其发送到
FindByNameAsync
之前不规范化。B Bailes还查看了IdentityServer4 4.1.1的源代码,它显示了上面的两个查询应该是等效的,
FindBynamesync
使用了
NormalizedUserName
列。您能否确认u.NormalizedUserName中提供的规范化名称与FindBynamesync搜索的用户名相同?是,我用另一行替换了一行。@Carson,我使用的是bbailes,我可以确认用户名是完全相同的。我们使用第一个查询找到的用户来测试FindBynameSync方法,但它仍然无法找到该用户。请理解,我的问题与术语“NormalizedName”u返回的值有关。我认为NormalizedUserName将是架构中的一个字段。您确定FindByNameAsync函数正在搜索该列,而不是另一列吗。由于我看不到您的架构,我正在与您确认没有“NormalizedUserName”列和“Username”列,其中搜索的数据可能是错误的字段。@Carson,有一个
Username
NormalizedUserName
UserName
都是小写的,
NormalizedUserName
中填充了
userManager.NormalizeName(model.UserName)。
我已经测试了这两个列,包括规范化
model.UserName
以及在将其发送到
FindByNameAsync
之前不规范化。b Bailes还查看了IdentityServer4 4.1.1的源代码,它表明上面的两个查询应该是等效的,
findbynamesync
使用了
NormalizedUserName
列。