如何在 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
,响应aud
为api://client-id of Web API Gateway application
。
关于第二个问题,理论上你分步用同一个账号登录,角色应该是一样的。如果您指的是权限,则它们与您设置的范围有关。以上是关于如何在 Azure Ad 中实现代流?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Azure AD B2C 中管理用户流之间的单个帐户/会话
Azure 数据工厂:如何在转换数据流中实现嵌套 sql 查询