【问题标题】:Is it possible to use impersonated access token within non-interactive session to get new access token to other Audience in Azure Active Directory?是否可以在非交互式会话中使用模拟访问令牌来获取 Azure Active Directory 中其他受众的新访问令牌?
【发布时间】:2022-01-24 16:26:16
【问题描述】:

演员:

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

流程: Power App 连接器调用 API A。在 API A (C#) 的代码中,我可以从 Authorization 标头中解码 JWT 并查看哪个用户已登录。现在,我必须调用 API B 和 API C,然后将某些内容返回给 Power App 连接器. API B 和 API C 还必须能够解码 JWT 并从令牌中获取 UPN。

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

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

【问题讨论】:

    标签: c# asp.net-web-api oauth-2.0 azure-active-directory


    【解决方案1】:

    这正是代表流程的用途。 它允许 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 的范围。

    【讨论】:

    • 它似乎不起作用。从 AAD 我得到“AADSTS500131:断言受众与呈现断言的客户端应用程序不匹配。断言中的受众是“A”,预期受众是“”或此应用程序的应用程序 Uris 与应用程序之一ID ''()。下游客户端必须为预期的受众(发出 OBO 请求的应用程序)请求令牌,并且此应用程序应使用该令牌作为断言。”。 OBO 请求中的范围属于受众 B。
    • 听起来像“断言”,即您收到的令牌的受众与该应用程序不匹配。检查令牌受众是否与 client_id 标识的应用匹配。
    • 我使用了错误的客户 ID。最后它起作用了。谢谢。
    猜你喜欢
    • 2018-02-17
    • 1970-01-01
    • 2019-11-06
    • 2020-05-25
    • 2021-06-01
    • 2018-03-24
    • 2019-08-25
    • 1970-01-01
    • 2023-03-19
    相关资源
    最近更新 更多