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

Security ADFS 4.0(2016)API资源的机密和本地客户端注册,security,adfs,adfs4.0,Security,Adfs,Adfs4.0,代表中所述的场景给出以下内容: 问题: 是否可以将ADFS 2016中的中间层服务配置为机密客户端(代表的中间层客户端)和从swagger ui使用的公共/本机客户端 了解样本 为了让中间层服务能够代表用户访问后端webapi,我们需要在ADFS中注册一个机密客户端(clientid/secret),并将clientid设置为访问群体,如文档中所述:“ida:Audience和ida:clientid相互匹配非常重要” 这意味着应用程序组现在包含一个机密客户机,其中间层服务URL(访问群体)设

代表中所述的场景给出以下内容:

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

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

这意味着应用程序组现在包含一个机密客户机,其中间层服务URL(访问群体)设置为clientId,而不是您在这里通常期望的guid,比如说为了本示例

这很好,示例现在可以工作了,请参阅:了解工作示例

问题 比方说,我现在想将带有swagger ui的swagger添加到中间层服务中。这将在ADFS中配置为本机客户端,因为我们希望使用隐式流。(ADFS 2016不支持使用PKCE的授权代码流)

但是

如果我们为swagger配置了一个带有guid的本机客户端,那么令牌将与一个不能用于访问中间层服务本身的访问群体一起发布。(从外观上看,它可用于访问用户信息端点:urn:microsoft:userinfo

要获取中间层服务的有效访问令牌,需要将clientid设置为访问群体,就像机密客户端一样

但是

ClientID在应用程序组中必须是唯一的,因此只能向访问群体注册一次ClientID

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

这似乎是一个超级基本的场景,可以轻松地配置IdentityServer,但在这种情况下,我只能使用ADF

ADFS配置 根据代表场景的文档提供的工作样本

ClientID设置为中端服务客户端的访问群体,以便能够代表用户访问后端WebAPI

为swagger注册的公共客户端,将由于guid为ClientID而不是资源url而导致访问量不足

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

通过将id\u令牌作为access\u令牌来解决此问题 我真的不喜欢这种解决方法,但至少它是有效的,我们可以通过将机密客户端用作公共客户端来解决这个问题

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

然后配置权限以允许其访问自身:

这允许我们向swagger客户端发出id_令牌

为什么不颁发访问令牌? 好问题!;-)不允许机密客户端请求访问令牌,即response\u type=token,但response\u type=id\u令牌是可以的

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

但一旦完成,我们就可以获得一个id_令牌,该令牌具有有效的访问群体,可用于访问我们的API

它还活着 ClientID作为观众非常重要:

为我们提供一个有效的id_令牌,该令牌具有访问API的正确访问群体:

不满意 但依我看,这是一种黑客行为,使用id_令牌作为访问令牌感觉是错误的。我真的很难修改swagger ui,让它通过带有授权头的id_令牌

请建议一种更好的方法