我目前正致力于将Identity Server 4设置为多个产品和联合网关的集中式authn点。这一切都很标准:
我的用户可以使用OIDC-Client js lib对使用隐式流与我的身份服务器进行交互的SPA进行身份验证。用户商店如下:
目标密钥 - 有问题的应用程序能够使用密钥生成唯一链接(假设它是一个guid,例如用途)。此键映射到应用程序中的特定目标,并用作事实身份验证。它与资源所有者密码流非常相似,只是密钥是进行身份验证所需的唯一组件。 (我知道这不是最安全的,但这是一个商业决策,考虑到较低的保护水平)。
这让我想到了:完成此目标密钥身份验证机制的正确“身份服务器”方式是什么。我考虑过的一些事情:
[HttpGet]
public async Task<IActionResult> Login(string returnUrl)
重新调用AccountController的“Login”方法这基本上会从URL中删除目标键,并使用dest键作为主题调用HttpContext.SignInAsync
。这不起作用,因为它似乎检查数据库是否存在主题(这是我最终尝试创建如上所述的自定义方案)任何关于适当扩展性的想法都会受到欢迎......
答案 0 :(得分:0)
不确定这是否是最好的方法,但我最终创建了一个IProfileService的自定义实现。它包装了一个IdentityServer4.AspNetIdentity.ProfileService
的实例,并检查是否存在&#34; destination_key&#34;要求。如果dest声明存在,它将引用目标键服务进行验证 - 否则,它会将逻辑委派给使用Asp.net标识的基础ProfileService实例。
在AccountController的Login
方法中,我只需检查acr_values以查找从客户端传递的目标密钥。这是在OIDC-Client.js lib的signinRedirect
方法中设置的。