是否可以在 non-interactive session 中使用模拟访问令牌来为 Azure Active Directory 中的其他受众获取新的访问令牌?

Is it possible to use impersonated access token within non-interactive session to get new access token to other Audience in Azure Active Directory?

演员:

  1. 用户登录后的黑匣子(MS Power App 自定义连接器)
  2. API A - 启用 [Authorize] 属性和 AAD 授权的 .NET Standard WebApi(代码中无额外验证),ida:audience="A" in web.config
  3. API B - 启用 [Authorize] 属性和 AAD 授权的 .NET Standard WebApi(代码中无额外验证),ida:audience="B" in web.config
  4. API C - 启用 [Authorize] 属性和 AAD 授权的 .NET Standard WebApi(代码中无额外验证),ida:audience="C" in web.config

流程: Power App 连接器调用 API A。在 API A (C#) 的代码中,我可以从授权 header 解码 JWT 并查看哪个用户已登录。现在,我必须调用 API B 和 API C 然后 return 到 Power App 连接器。 API B 和 API C 也必须能够解码 JWT 并从令牌中获取 UPN。

问题: 当我尝试重用整个授权 header(只需在 API A 中获取它并添加到 HttpClient 以调用 API B 和 C)时,我得到 401。 现在我知道那是因为 ida:Audience 值。我想这是 .NET 框架验证的一部分,超出了我的控制范围。当我将 API B 和 C 中的 ida:Audience 更改为“A”时,它起作用了。但这只是为了测试目的,我不允许在生产中这样做。 然后我尝试将 Power App 连接器中的范围设置为具有不同受众的多个值(由 space 分隔)- 运气不好,AAD 出错,不允许多个受众。

所以,我的问题是:在我的场景中是否可以做我需要的事情?我只有受众 A 的访问令牌,并且必须在具有其他受众价值的端点中授权(模拟)。

这正是 on-behalf-of 流程的目的。 它允许 API A 获取它收到的访问令牌,并向 API B 请求访问令牌(令牌中具有相同的用户信息)。 有关流程的更多信息:https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-oauth2-on-behalf-of-flow.

从文档到使用客户端密钥的令牌端点的示例请求内容:

//line breaks for legibility only

POST /oauth2/v2.0/token HTTP/1.1
Host: login.microsoftonline.com/<tenant>
Content-Type: application/x-www-form-urlencoded

grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer
client_id=535fb089-9ff3-47b6-9bfb-4f1264799865
&client_secret=sampleCredentia1s
&assertion=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6InowMzl6ZHNGdWl6cEJmQlZLMVRuMjVRSFlPMCJ9.eyJhdWQiOiIyO{a lot of characters here}
&scope=https://graph.microsoft.com/user.read+offline_access
&requested_token_use=on_behalf_of

使用 MSAL.NET 肯定比直接使用 HTTP 端点要好。 您可以将此请求中的 scope 替换为 API B.

中的范围