API 资源的 ADFS 4.0 (2016) 机密和本机客户端注册

ADFS 4.0 (2016) confidential and native client registration for API resource

鉴于以下代表场景,如中所述:https://docs.microsoft.com/sv-se/windows-server/identity/ad-fs/development/ad-fs-on-behalf-of-authentication-in-windows-server

问题

是否可以将 ADFS 2016 中的中间层服务配置为机密客户端(中间层客户端代表)AND a public/native swagger 要使用的客户端 ui?

了解样本

为了中间层服务能够代表用户访问后端 webapi,我们需要在 ADFS 中注册一个机密客户端 (clientid/secret),并将 ClientID 设置为 Audience,如下所示文档中说明:"It is very important that the ida:Audience and ida:ClientID match each other"

意味着应用程序组现在包含一个机密客户端,中间层服务 URL(受众)设置为 clientId,而不是您通常在这里期望的 guid,假设 https://localhost:5005 为了这个示例。

这很好,示例现在可以工作了,请参阅:https://github.com/ajtowf/WebApp-OpenIDConnect-DotNet 工作示例。

问题

假设我现在想用 swagger-ui 添加 swagger 到中间层服务。恕我直言,这将在 ADFS 中配置为本机客户端,因为我们要使用隐式流。 (ADFS 2016 不支持使用 PKCE 的授权代码流)

但是

如果我们为 swagger 配置带有 guid 的本机客户端,将向无法用于访问中间层服务本身的观众颁发令牌。 (从外观上看,它可用于访问用户信息端点:urn:microsoft:userinfo

要获得中间层服务的有效 access_token,需要将 clientid 设置为受众,就像在机密客户端案例中一样。

但是

ClientID在应用组内需要唯一,因此只能有一个clientid设置为观众的注册。

是否可以配置两个单独的 flows/clients?我错过了什么吗?

这似乎是一个超级基本的场景,可以使用 IdentityServer 轻松配置,但在这种情况下我坚持使用 ADFS。

ADFS 配置

根据 On-Behalf-Of 场景文档的工作示例。

ClientID 设置为 Mid Tier Service Client 的 Audience,以便能够代表用户访问后端 WebAPI。

Public swagger 的客户端注册,由于 guid 作为 ClientID 而不是资源 url.

,将导致受众不佳

不能(显然)添加另一个具有相同 ClientID 的应用程序。

通过将 id_token 作为 access_token

传递的解决方法

我真的不喜欢这个解决方法,但至少它有效,我们可以解决这个问题 通过使用机密客户端作为 public 客户端(没有的秘密)。

添加了用于 ADFS 的 oauth2 重定向 uri 作为服务器应用程序的有效 URI(我知道!!!)

然后配置权限让它自己访问:

这允许我们向 swagger 客户端发出 id_token。

为什么不发布 access_token?

好问题! ;-) 机密客户端不允许请求 access_token,即 response_type=token,但 response_type=id_token 可以。

如果您像我一样使用 swagger-ui,则需要进行一些修改,因为响应类型是硬编码的,请参阅;

但是一旦完成,我们就可以得到一个 id_token 和一个有效的观众,可以用来访问我们的 API。

它还活着

作为受众的 ClientID 非常重要:

为我们提供了一个有效的 id_token 和正确的受众来访问 API:

不满意

但是恕我直言,这是一个 hack,使用 id_token 作为 access_token 感觉不对。我真的很努力修改 swagger-ui 让它通过 id_token 授权 header!

请提出更好的方法