1

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

ADFS OBO

问题

是否可以将 ADFS 2016 中的中间层服务配置为机密客户端(代表中间层客户端)从 swagger ui 中使用的公共/本机客户端?

了解示例

为了让中间层服务能够代表用户访问后端 webapi,我们需要在 ADFS 中注册一个机密客户端(clientid/secret),并将 ClientID 设置为 Audience,如文档中所述:“它ida:Audience 和 ida:ClientID 相互匹配非常重要”

这意味着应用程序组现在包含一个机密客户端,其中中间层服务 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 设置为受众的注册。

甚至可以配置两个单独的流/客户端吗?我错过了什么吗?

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

ADFS 配置

根据代表方案的文档的工作示例。 根据代表方案的文档的工作示例。

ClientID 为中间层服务客户端设置为受众,以便能够代表用户访问后端 WebAPI。 ClientID 为中间层服务客户端设置为受众,以便能够代表用户访问后端 WebAPI。

swagger 的公共客户端注册,由于 guid 作为 ClientID 而不是资源 url,将导致不良受众。 swagger 的公共客户端注册,由于 guid 作为 ClientID 而不是资源 url,将导致不良受众。

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

4

1 回答 1

1

通过将 id_token 作为 access_token 传递的解决方法

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

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

在此处输入图像描述

然后配置权限以允许它访问自己:

在此处输入图像描述

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

为什么不发出 access_token?

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

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

但是一旦完成,我们可以获得一个具有有效受众的 id_token,可用于访问我们的 API。

它还活着

ClientID 作为 Audience 超级重要: 在此处输入图像描述

为我们提供了一个有效的 id_token 和正确的受众来访问 API: 在此处输入图像描述

不满意

但恕我直言,这是一个 hack,使用 id_token 作为 access_token 感觉不对。而且我真的很难修改 swagger-ui 以使其通过带有授权标头的 id_token !

请提出一个更好的方法来做到这一点

于 2019-05-09T15:17:35.243 回答