【问题标题】:Azure OAuth2 Client Credential flow - getting token for multiple scopes throws errorAzure OAuth2 客户端凭据流 - 获取多个范围的令牌会引发错误
【发布时间】:2020-04-28 18:30:47
【问题描述】:

当使用 MSAL 库为后台控制台应用程序生成访问令牌时,使用 client_credentials 调用两个 REST 端点,获取令牌调用创建为:

client_id=XXX&client_info=1&client_secret=XXXX&scope=api%3A%2F%2FMyService-DevBlr-ClientServices%2F.default+api%3A%2F%2FMyService-DevBlr-CoreServices%2F.default&grant_type=client_credentials

并发布到

https://login.microsoftonline.com/a1326aec-378e-4433-8e2a-67a086554fc8/oauth2/v2.0/token

响应是 400 错误:

{"error":"invalid_scope","error_description":"AADSTS70011: The provided request must include a 'scope' input parameter. The provided value for the input parameter 'scope' is not valid. The scope api://MyService-DevBlr-ClientServices/.default api://MyService-DevBlr-CoreServices/.default is not valid.\r\nTrace ID: 203ad632-5e7c-4e61-9dcd-185eb9b49200\r\nCorrelation ID: 99fd979a-2c11-485b-ba14-c0cad3312e02\r\nTimestamp: 2020-01-11 08:36:29Z","error_codes":[70011],"timestamp":"2020-01-11 08:36:29Z","trace_id":"203ad632-5e7c-4e61-9dcd-185eb9b49200","correlation_id":"99fd979a-2c11-485b-ba14-c0cad3312e02"}

当传入单个作用域时,调用正常:

Request:
client_id=XXXX&client_info=1&client_secret=XXXX&scope=api%3A%2F%2FMyService-DevBlr-CoreServices%2F.default&grant_type=client_credentials 

Response:
{"token_type":"Bearer","expires_in":3599,"ext_expires_in":3599,"access_token":"eyJ0e..."}

Request: 
client_id=XXXX&client_info=1&client_secret=XXXX&scope=api%3A%2F%2FMyService-DevBlr-ClientServices%2F.default&grant_type=client_credentials

Response:
{"token_type":"Bearer","expires_in":3599,"ext_expires_in":3599,"access_token":"eyJ0eX..."}

文档和 API 支持范围数组: https://github.com/AzureAD/microsoft-authentication-library-for-dotnet/wiki/Client-credential-flows#code-snippet

将单个令牌用于多个服务调用是有好处的,但我似乎无法使其正常工作。任何建议表示赞赏。

【问题讨论】:

  • 为特定受众生成令牌。在您的情况下,您需要每次使用不同的范围调用该函数 2 次,然后相应地使用令牌。

标签: azure oauth-2.0 msal


【解决方案1】:

当您获取访问令牌时,您只能为一个 API 指定范围。 在我看来,您正在尝试获取具有 2 个 API 权限的令牌。 这是不可能的。

访问令牌始终只包含一个 API 的权限。 所以你必须单独申请。

这是由于令牌具有受众 (aud) 声明,该声明标识了它所针对的 API。 它不能有两个值。

【讨论】:

  • 有道理。文档不是很清楚,所以我无法确认这种行为。谢谢,节省了我解决此问题的时间
  • 感谢您的回答。任何人都知道为什么在这种情况下范围是一个字符串数组?这意味着您可以传入多个范围。这就是一开始让我失望的原因。
  • 您可以为一个 API 传递多个范围
  • 在客户端凭据流上下文中实际上没有意义
  • @juunas - 你说你可以为一个 API 传递多个范围。我正在尝试这样做,但我不知道怎么做!
猜你喜欢
  • 2021-06-20
  • 2023-03-25
  • 2022-01-26
  • 2019-04-04
  • 2021-12-22
  • 2019-11-09
  • 2019-09-06
  • 1970-01-01
  • 2017-10-26
相关资源
最近更新 更多