1

设置:
我们有一个应用程序需要借助 ADFS 对 API 进行身份验证。为此,似乎适合使用 Client Credentials Grant Flow;
https://docs.microsoft.com/en-us/windows-server/identity/ad-fs/overview/ad-fs-openid-connect-oauth-flows-scenarios#client-credentials-grant-flow

因此,在 ADFS 中,我使用以下设置创建了一个新的应用程序组,其中包含一个服务器应用程序和一个 Web API,

服务器应用:

  • 客户编号:client1
  • 客户秘密:(一些指导)

网络接口:

  • 依赖方:client1
  • 访问控制策略:允许所有人
  • 客户端权限 --> 客户端应用程序:client1
  • 允许的范围:openid profile allatclaim

然后我通过 https://.../adfs/oauth2/token 请求一个令牌

client_id=client1
client_secret=(some-guid) 
grant_type=client_credentials

我按预期收到了带有 aud 和 appid 的 JWT 令牌:

"aud": "microsoft:identityserver:client1"
"appid": "client1"

问题:
当我想添加另一个客户端与 API 一起使用时,问题就出现了。所以我将设置更改为,

服务器应用程序 1:

  • 客户编号:client1
  • 客户秘密:(一些指导)

服务器应用程序 2:

  • 客户编号:client2
  • 客户秘密:(一些指导)

网络接口:

  • 依赖方:client1、client2
  • 访问控制策略:允许所有人
  • 客户端权限 --> 客户端应用程序:client1,client2
  • 允许的范围:openid profile allatclaim

然后,当我使用 client2(client_id 和 client_secret)的凭据请求 JWT 令牌时,我得到:

"aud": "microsoft:identityserver:client1"

如果我使用client1也是一样的。我尝试在 Web API 中添加不同的依赖方,它似乎总是将 JWT 中的 aud 设置为列表中的第一个 RP(字母顺序)。例如,如果我还在 Web API 中添加 123 作为 RP,那么对于 client1 和 client2,“aud”将变为“microsoft:identityserver:123”。

如果我改为删除所有依赖方并将 url 添加到我的 api 中,则 JWT 令牌中的 aud 将变为“urn:microsoft:userinfo”。

根据我的阅读,JWT 令牌中的 aud 字段应包含将处理 JWT 令牌的所有委托人。见https://www.rfc-editor.org/rfc/rfc7519#section-4.1.3

问题:
应该如何设置我的应用程序组才能拥有多个客户端?
ADFS 可以发送多个受众而不是只发送第一个受众吗?
还是我使用了错误的方法?

亲切的问候,杰斯珀

4

1 回答 1

1

通过反复试验,我终于找到了解决方法!

Web API 中的依赖方应该只包含 Web API(而不是服务器应用程序)的标识符,例如这可能是像“ https://mywebapi.com ”这样的地址。

客户端权限 --> 客户端应用程序应包含应允许与该服务器通信的服务器应用程序。

然后,当从 ADFS 请求 JWT 令牌时,您还需要包含参数“resource”,该值应该是 Web API 的标识符之一。因此调用的调用体变为

client_id=client1
client_secret=(some-guid) 
grant_type=client_credentials
resource=https://mywebapi.com

我试图搜索资源字段以了解更多信息,但找不到任何解释或任何使用它的网站。

于 2020-03-03T07:30:03.837 回答