Identity Server 4自定义方案

时间:2018-02-13 18:33:29

标签: authentication asp.net-core-2.0 identityserver4

我目前正致力于将Identity Server 4设置为多个产品和联合网关的集中式authn点。这一切都很标准:

enter image description here

我的用户可以使用OIDC-Client js lib对使用隐式流与我的身份服务器进行交互的SPA进行身份验证。用户商店如下:

  • IDSRV(Asp.net标识)本地的用户存储。他们将凭证输入到IDSRV中托管的表单中,就像在文档
  • 中看到的那样
  • openid connect或oauth 2商店,可以是社交(google,linkedin等)集成,也可以是我们的客户提供的IDP。也正常工作,就像在文档中一样。
  • “目标密钥”,如下所述

目标密钥 - 有问题的应用程序能够使用密钥生成唯一链接(假设它是一个guid,例如用途)。此键映射到应用程序中的特定目标,并用作事实身份验证。它与资源所有者密码流非常相似,只是密钥是进行身份验证所需的唯一组件。 (我知道这不是最安全的,但这是一个商业决策,考虑到较低的保护水平)。

这让我想到了:完成此目标密钥身份验证机制的正确“身份服务器”方式是什么。我考虑过的一些事情:

  • 在IDSRV中配置的自定义身份验证方案。我添加了一个名为“destkey”的通用方案,附带AuthenticationHandler和AuthenticationSchemeOptions实现。 HandleAuthenticateAsync方法将使用注入的服务来验证目标密钥。出于某种原因,它忽略了这一点并继续验证Asp.Net身份
  • 自定义授权类型。我希望创建一个IExtensionGrantValidator的实现,它将利用目标密钥服务来验证密钥。我无法使其正常工作,至少部分是因为OIDC lib不允许配置授权类型。
  • 从IDSRV快速入门[HttpGet] public async Task<IActionResult> Login(string returnUrl)重新调用AccountController的“Login”方法这基本上会从URL中删除目标键,并使用dest键作为主题调用HttpContext.SignInAsync。这不起作用,因为它似乎检查数据库是否存在主题(这是我最终尝试创建如上所述的自定义方案)

任何关于适当扩展性的想法都会受到欢迎......

1 个答案:

答案 0 :(得分:0)

不确定这是否是最好的方法,但我最终创建了一个IProfileService的自定义实现。它包装了一个IdentityServer4.AspNetIdentity.ProfileService的实例,并检查是否存在&#34; destination_key&#34;要求。如果dest声明存在,它将引用目标键服务进行验证 - 否则,它会将逻辑委派给使用Asp.net标识的基础ProfileService实例。

在AccountController的Login方法中,我只需检查acr_values以查找从客户端传递的目标密钥。这是在OIDC-Client.js lib的signinRedirect方法中设置的。