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,则需要进行一些修改,因为响应类型是硬编码的,请参阅;
- https://github.com/swagger-api/swagger-ui/issues/3906
- https://github.com/swagger-api/swagger-ui/issues/4084
但是一旦完成,我们就可以得到一个 id_token 和一个有效的观众,可以用来访问我们的 API。
它还活着
为我们提供了一个有效的 id_token 和正确的受众来访问 API:
不满意
但是恕我直言,这是一个 hack,使用 id_token 作为 access_token 感觉不对。我真的很努力修改 swagger-ui 让它通过 id_token 授权 header!
请提出更好的方法
鉴于以下代表场景,如中所述: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 配置
通过将 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,则需要进行一些修改,因为响应类型是硬编码的,请参阅;
- https://github.com/swagger-api/swagger-ui/issues/3906
- https://github.com/swagger-api/swagger-ui/issues/4084
但是一旦完成,我们就可以得到一个 id_token 和一个有效的观众,可以用来访问我们的 API。
它还活着
为我们提供了一个有效的 id_token 和正确的受众来访问 API:
不满意
但是恕我直言,这是一个 hack,使用 id_token 作为 access_token 感觉不对。我真的很努力修改 swagger-ui 让它通过 id_token 授权 header!
请提出更好的方法