如何在 Azure Ad 中实现代流?

Posted

技术标签:

【中文标题】如何在 Azure Ad 中实现代流?【英文标题】:How to implement On behalf of flow in Azure Ad? 【发布时间】:2021-06-13 23:21:16 【问题描述】:

网络核心应用程序。我在 azure ad 中注册了三个应用程序。

    React SPA 应用程序 Web API 网关应用程序 受保护的 API 应用程序

每当用户登录 SPA 应用程序时,都会使用隐式流重定向到 Azure AD 以获取访问令牌。 我已收到如下访问令牌并用于从网关层访问 apis


  "aud": "7851c317b-87e7-4cb3-95f0-37cb52b6f873",
  "family_name": "alex",
  "given_name": "fernandes",
  "hasgroups": "true",
  "roles": [
      "Admin"
  ]

在上面的令牌中,aud 是 spa 应用程序的客户端 ID 和我添加的其他一些细节,但不是所有细节。

现在我想从 Web API Gateway 应用程序调用受保护的 API 应用程序

我正在尝试在邮递员中使用示例 http 请求,如下所示。

请求 - https://login.microsoftonline.com/45fgh-f30d-4596-gt67-7045b338485a/oauth2/v2.0/token

身体


"grant_type": "urn:ietf:params:oauth:grant-type:jwt-bearer"
"client_id": "" //unknown client id of SPA or API GateWay or Protected API
"client_secret": "" //unknown client id of SPA or API GateWay or Protected API
"assertion": "Above token"
"scope":"" //unknown
"requested_token_use" : "on_behalf_of"

除了上述困惑之外,只是想知道 azure ad 中是否需要任何配置才能为受保护的 API 生成令牌。还有一件事是为访问受保护的 API 而生成的令牌,该令牌是否具有与上述 SPA 生成的令牌相同的用户详细信息和角色详细信息?

有人可以帮我配置代表流量吗?我在这里努力完成这项工作。任何帮助,将不胜感激。谢谢

【问题讨论】:

【参考方案1】:

如下图所示,Client App 表示 React SPA 应用,Web API 1 表示 Web API Gateway 应用,Web API 2 表示 Protected API 应用。详情请见this blog。

代理流程的步骤:

    将 Web API Gateway 应用的 API 权限添加到 SPA 应用。

GET https://login.microsoftonline.com/tenant/oauth2/v2.0/authorize
?scope=permission for Web API Gateway application like api://1108f6-xxxxxxx-9f622/test openid
&redirect_uri=redirect_uri of SPA application
&nonce=123
&client_id=client-id of SPA application
&response_type=id_token token
    将 Protected API 应用的 API 权限添加到 Web API Gateway 应用。

它调用了官方document中的Microsoft Graph API,所以这一步的作用域是'user.read'。

POST https://login.microsoftonline.com/tenant/oauth2/v2.0/token
grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer
&client_id=client_id of Web API Gateway application
&client_secret=client_secret
&assertion=access token from previous step
&scope=permission for Protected API application
&requested_token_use=on_behalf_of
    使用访问令牌调用受保护的 API 应用程序

【讨论】:

如果我的回复有帮助,请采纳,谢谢。 嗨帕梅拉感谢您的回答。它真的会帮助我。我有几点要问。上面第二步获取token,我们必须传递client id、client secrete和assertion。我试过如上。它所说的错误消息是 aud in token(从 spa 接收)和在步骤 2 中传递的客户端 ID 应该相同。但在我从 SPA 客户端收到的令牌中,是在 azure AD 中注册的 SPA 应用程序的客户端 ID。 第二个问题,如果我能够在步骤 2 中成功生成令牌,那么我将获得令牌中的所有角色,因为当我在步骤 1 中为 SPA 生成令牌时,我有关联的组和角色它。在我受保护的 API 中,所有业务逻辑都基于角色运行。所以我想要令牌中的相同角色。这会发生吗?你能帮我理解这里的概念并帮助我实现这一目标吗?谢谢 你试过代码了吗?在step1中,作用域为api://client-id of Web API Gateway application/scope-name,响应audapi://client-id of Web API Gateway application 关于第二个问题,理论上你分步用同一个账号登录,角色应该是一样的。如果您指的是权限,则它们与您设置的范围有关。

以上是关于如何在 Azure Ad 中实现代流?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Azure AD B2C 中管理用户流之间的单个帐户/会话

Azure 数据工厂:如何在转换数据流中实现嵌套 sql 查询

Android/iOS:如何使用 SAML 协议通过 Azure AD 为移动设备提供 SSO

Azure AD:如何将安全组和应用程序角色都放入访问令牌

Azure AD B2C 将用户流与应用一对一关联

2020新书现代数据仓库,297页pdf,The Modern Data Warehouse in Azure