【问题标题】:IdentityServer4 FindByNameAsync always nullIdentityServer4 FindByNameAsync 始终为空
【发布时间】: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,UserNameNormalizedUserName 都有。 UserName 全部小写,NormalizedUserName 填充有userManager.NormalizeName(model.Username). 我已经测试了这两列,包括规范化model.UserName 以及在发送到FindByNameAsync 之前不规范化它。 bbailes 还查看了 IdentityServer4 4.1.1 的源代码,它表明上面的两个查询应该是等效的,并且FindByNameAsync 使用了NormalizedUserName 列。

标签: .net-core identityserver4


【解决方案1】:

我与@bbales 合作,我终于弄明白了。

我们有一个名为MultiTenantIdentityUserStore 的类,我们使用它来覆盖一些东西以使应用程序成为多租户。不幸的是,这并不明显被使用。

在其中,我们有一个属性:

public TTenantKey TenantId { get; set; }

这用于覆盖Users公共属性:

public override IQueryable<TUser> Users => base.Users.Where(u => u.TenantId.Equals(TenantId));

一旦我设置了UserStore.TenantId,调用UserStore.Users.ToList()就如预期的那样从0结果变为13。作为比较,UserStore.Context.Users.ToList() 有 22 条记录,因为我们正在将用户从旧版本的 IdentityServer4 迁移到当前版本的 4.1.1。

现在使用上面的第二个查询返回一个用户:

var user = await userStore.FindByNameAsync(userManager.NormalizeName(model.Username));

顺便说一句,这也使UserManagerSignInManager.UserManager 在使用相同方法时按预期工作。 (如果你不知道,UserManagerSignInManager.UserManager 是同一个对象。)这是因为UserManager 使用UserStore 来访问Users。当你有依赖注入提供这些对象时,它们都正确地相互引用。

似乎此答案仅适用于我们的实例,但由于此堆栈上有许多具有相同问题的未解决问题,这可能是人们没有发现的普遍问题,或者至少没有更新他们弄清楚后的问题。我可能已经阅读了至少一打没有答案的书。我想知道他们中有多少人有同样的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-18
    • 2017-07-31
    • 2019-07-18
    • 2019-08-18
    • 2011-12-29
    • 2019-07-02
    • 2019-05-04
    相关资源
    最近更新 更多