如何使 Azure AD access_token 在 Microsoft Graph API 之外对其签名验证兼容?

Posted

技术标签:

【中文标题】如何使 Azure AD access_token 在 Microsoft Graph API 之外对其签名验证兼容?【英文标题】:How to make Azure AD access_token compliant for its signature validation outside Microsoft Graph APIs? 【发布时间】:2020-08-14 09:36:16 【问题描述】:

我创建了一个 Azure AD 移动和桌面应用程序。现在我正在使用以下 API 获取我的 access_token,

POST https://login.microsoftonline.com/Directory(租户)ID /oauth2/令牌 密码:通过 client_id:id 资源:https://graph.microsoft.com 授予类型:密码 客户秘密:秘密 用户名:用户名 范围:openid

响应看起来像, "access_token": "accessToken", "refresh_token": "refereshToken", “id_token”:“id_token”。

现在我将 access_token 传递给配置有相同 Azure AD 客户端的第三方应用程序。当该第三方应用程序尝试验证签名时,操作将失败。 然后才知道它是因为 nonce 仅适用于 microsoft graph API。现在如何删除相同或使我的 access_token 签名验证符合要求?

【问题讨论】:

您不应该验证不适合您的访问令牌。图形 API 令牌也很特殊。您需要使用与您正在调用的 API 匹配的 resource(API 的客户端 ID 或应用 ID URI)。 感谢您的回复,如前所述,我将 access_token 传递给第三方软件。相同的 access_token 将由第三方软件验证。那么如何让access_token独立于GRAPH API呢? 如果您不需要调用Microsoft Graph API,那么您在请求token时不需要请求“graph.microsoft.com”作为资源参数。 @CarlZhao 我应该传递什么来代替“资源”参数?我应该创建一个新范围吗? @ShreyasHollaP 正如 juunas 所说,您需要使用与您正在调用的 API 匹配的 resource 【参考方案1】:

您需要创建另一个代表 Web api 的 Azure AD 应用程序,然后使用您的客户端应用程序调用 Web api 应用程序

首先需要暴露代表web api的应用的api,可以按照如下流程进行配置:

Azure 门户>应用注册>公开 API>添加范围>添加客户端应用程序

接下来,你需要定义api应用的ma​​nifest,并将应用权限授予你的客户端应用(这个是你自己定义的角色权限,你可以在My APIs 添加权限时)

This是定义清单的过程。

这是为客户端应用程序授予权限:

最后,您可以为您的 api 应用程序请求一个令牌(注意 resource 参数不再是 Microsoft Graph API,它是您的 API 应用程序的客户端 ID 和您在清单)。

更新:

仅针对应用程序权限,一般不推荐使用 ROPC 流。建议您使用基于 v2.0 端点的client credential flow。在使用 v2.0 端点时,resources 将不再作为参数,而是将 scope 作为参数,但它们的功能是相同的。 (注意范围参数是这样的:api://a13b414b-93b3-4aae-bb-xxxxxxxxx/.default)。

解析令牌,您将看到自定义的应用角色

【讨论】:

如果我的回答对您有帮助,您可以接受它作为答案(单击答案旁边的复选标记,将其从灰色切换为已填充。)。请参阅meta.stackexchange.com/questions/5234/… 这可能对其他社区成员有益。谢谢。 感谢详细步骤。遵循相同的方法,当我将资源传递为“api://3d32b75d-dbd6-4518-9eae-eb35a3d6f989/read.write”(创建为新范围)而不是microsoft.graph.com时,我得到以下错误,,什么是这里缺少的权限,因为如果资源是“https:graph.microsoft.com”,我可以获得 access_token "error": "invalid_resource","error_description": "AADSTS500011: 在租户中找不到名为 api://3d32b75d-dbd6-4518-9eae-eb35a3d6f989/read.write 的资源主体命名为 bc358f98-0ec2-40f7-b6b7-16c4d6e7a64a。如果租户管理员未安装应用程序或租户中的任何用户未安装应用程序,则可能会发生这种情况。您可能已将身份验证请求发送给错误的租户。\ r\n跟踪 ID:43561103-d16b-42fa-a484-4745cbb05200\r\n相关 ID:4ec2ba5d-84f1-421f-8136-be537380eff0\r\n时间戳:2020-08-18 09:45:34Z", "error_codes": [500011] 在 API 权限中已授予新的应用程序权限并授予管理员同意清单中添加的新 appRole 是否存在 appRoles: "displayName","value","id" 与应用程序的“公开 API”部分中的应用程序 ID URI、范围名称、管理员同意显示名称的任何关系注册?

以上是关于如何使 Azure AD access_token 在 Microsoft Graph API 之外对其签名验证兼容?的主要内容,如果未能解决你的问题,请参考以下文章

服务主体的Azure AD OIDC ID令牌

如何使用 id_token 从 Azure Function 应用程序获取 Azure access_token?

更新 Azure IDP 配置,使刷新令牌采用 JWT 格式

Azure AD和Windows AD功能对比

Azure AD和Windows AD功能对比

Azure AD 域服务