我们正在尝试将IdentityServer4集成到我们想要合并两个登录帐户(传统意义上不是2FA)的设施中。用户将被预先登录到固定在建筑物中物理位置的计算机上的Windows“服务”帐户。每个IS4 Windows Authentication会使用服务帐户将它们自动认证为IS4。然后,用户将在Web应用程序表单(例如IS4快速入门登录表单)中使用其个人Active Directory凭据进行登录。这将使我们能够根据用户的身份和位置授予更精细的权限。
我们正在尝试实现IProfileService
来调用需要两个帐户ID的内部API。我们从GetProfileDataAsync()
中该内部API的响应发出的声明应该是两个帐户权限重叠的结果。 IsUserActiveAsync()
应该验证服务帐户和用户帐户均处于活动状态。
我们如何从IProfileService
的实现中访问两个帐户ID?传递给ClaimsPrincipal
方法的类型IProfileService
的子参数似乎仅支持一个帐户。现成的IS4是否支持这种类型的环境,还是需要一些自定义?
答案 0 :(得分:1)
这些只是假设,但在我看来,该服务帐户实际上不是真实的用户帐户,而是计算机的帐户。因此,它实际上不是识别用户,而是计算机。从您写的内容来看,似乎只有位置很重要。
我认为extension grants可能是您的解决方案。因为您可以为计算机/用户创建自定义登录名。将信息合并到一个访问令牌中。
另一种选择是查看IP地址。但这仅在计算机具有固定的已知IP地址时有效。
这两个选项都会将用户绑定到该位置。
尽管IdentityServer具有这样做的结构,但是为了使访问令牌保持较小,权限不应该是设置的一部分。相反,您可能需要查看处理权限的授权服务器(例如PolicyServer)。在这种情况下,您可以使用计算机的Windows用户名(如果已验证并且是令牌的一部分)或ip地址以及用户ID来获取该位置用户的权限。
答案 1 :(得分:0)
我们找到的解决方案是修改登录流程,以立即执行透明的Windows身份验证,然后执行用户名/密码身份验证。我们在用户名/密码身份验证期间在自定义声明中缓存了Windows身份验证的用户名,以便可以在Principal
的{{1}}中访问服务帐户和用户帐户。