【问题标题】:IdentityServer4 + ASP.Identity - Authenticate different user types from different databasesIdentityServer4 + ASP.Identity - 验证来自不同数据库的不同用户类型
【发布时间】:2022-01-18 17:43:35
【问题描述】:

起初,该应用程序拥有能够使用 ASP.Identity + IdentityServer4 (OpenId Connect) 进行身份验证的常规用户。

后来添加了Employees和Student,它们是不同数据库中的不同实体。

现在我需要有 2 个独立的移动应用程序,一个用于员工,一个用于学生,都具有 oAuth 身份验证。

有没有办法让 IDSrv4 和 ASP.Identity 的单个实例可以处理这 3 种用户类型的身份验证,但不必将它们全部合并到一个数据库表中?它们有完全不同的要求,登录详细信息可能重叠,因此需要保留在具有不同登录表单的单独数据库/表中。

这些用户最终将共享范围(需要访问共享 api)。

每种类型的主题会有所不同,即:user-1 vs employee-1 vs student-1

我试图避免的可能解决方案:

  • 拥有单独的 IDSrv4 实例来验证每种用户类型
  • 将所有 3 种用户类型合并到 1 个单个表中并使用单个 IDSrv4 实例

【问题讨论】:

  • 您可以拥有 1 个 IdSrv4 和多个具有不同范围配置的客户端配置,您可以对其应用不同的策略,但这要求所有用户都必须在 IdSrv4 数据库中。
  • 我不同意 - IDS4 不关心用户的存储方式或位置 - 只要您能够根据给定的上下文确定要转到哪个数据库可以做你喜欢的事。痛苦在于让 ASP.Net Identity 以你想要的方式工作——你可能不得不放弃它并推出你自己的等效功能。
  • 谢谢,这就是我的假设。我会做一些 asp.net 身份实验,看看效果如何。 @Eldar:谢谢,这就是我要避免的。
  • 我看到有一种方法可以为每种用户类型使用不同的 cookie 身份验证方案,并且通过实现不同的登录名并针对特定方案进行身份验证,效果很好。问题是 IDS4 在检查用户是否经过身份验证时,它使用默认 cookie 方案或 IDS4 配置中的一组。我找不到解决方法。能够为每个客户端设置 cookie 方案会很棒。
  • 目前,使用 IDS4 似乎很难做到这一点,因为它不支持多会话场景。我似乎越来越需要为每种用户类型运行单独的 IDS4 服务。

标签: c# asp.net asp.net-core asp.net-identity identityserver4


【解决方案1】:

IdentityServer 不关心您如何验证您的用户,您可以添加到 AccountController 类逻辑以在任一数据库中查找用户,然后将用户登录到 IdentityServer。

除了AccountController,您还需要调整IProfileService,因为它需要能够在登录后查找用户。

【讨论】:

  • 嗨撕。谢谢回复。我观察到的是,只能为 IDS4 设置一种身份验证方案(或使用默认方案)。拥有多个用户类型,您可能会为每个用户类型设置一个单独的身份验证方案,因为您可能会同时为多个用户类型请求访问令牌。点击授权端点将始终使用配置的单一方案。 IDS4 还设置了单个会话 cookie。我尚未验证,但有人提到注销将是一个问题,因为 IDS4 不处理多个会话。也许我错过了一些东西,会做更多的研究。
  • 正如我在回答中所说,IdentityServer 并不关心您如何登录用户或登录/同意屏幕的外观。因此,您可以让用户选择如何登录,然后告诉 IdentityServer 用户登录。密码检查由您在您“拥有”的 AccountController 中完成,而不是在 IdentityServer 引擎中完成。
  • 在我的想法中,我希望在 IdentityServer 和您的客户端/API 之间只有一个方案/cookie 和一种类型的令牌。在访问/ID 令牌中,您可以包含说明用户来源的声明。
  • 是的,那将是最佳选择,但是对这两种类型使用单一方案是否能够分别处理两种类型的asp.identity login/logout?在这种情况下,Asp.Identity 将为两者使用一个 cookie。如果不进行一些重写,即使可能,也无法访问 IDS4 授权和检查会话端点。关于多个会话 Dominick Baier 提到它们不受支持。无论如何,我会在测试项目上做更多的研究。
  • 我自己并没有太多使用 ASP.NET Identity,但最后你想要一个方案来处理你的令牌,理论上你可以拥有多个 AccountController 类的副本,每个副本都签名在不同的数据库中对用户进行身份验证......是一种方法
猜你喜欢
  • 1970-01-01
  • 2013-05-29
  • 1970-01-01
  • 2016-04-12
  • 1970-01-01
  • 2012-12-04
  • 2014-09-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多