【Azure API 管理】在 Azure API 管理中使用 OAuth 2.0 授权和 Azure AD 保护 Web API 后端,在请求中携带Token访问后报401的错误

问题描述

配置 JWT 验证策略,对请求进行预授权”。 当在API中配置JWT Policy时,如以下内容:

<validate-jwt header-name="Authorization" failed-validation-httpcode="401" failed-validation-error-message="Unauthorized. Access token is missing or invalid.">
    <openid-config url="https://login.partner.microsoftonline.cn/{aad-tenant}/.well-known/openid-configuration" />
    <required-claims>
        <claim name="aud">
            <value>xxxxxxxx-xxxx-xxxx-xxxx-d322750988cb</value>
        </claim>
    </required-claims>
</validate-jwt>

其中虽然携带了正确的Authorization Token,但是依旧还是会遇见 “IDX10205: Issuer validation failed. Issuer: 'https://sts.chinacloudapi.cn/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/'. Did not match: validationParameters.ValidIssuer: '' or validationParameters.ValidIssuers: 'https://login.partner.microsoftonline.cn/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/v2.0'." 错误。

问题原因

报错信息最可能的原因是policy中openid-config url填写错误。<openid-config url="https://login.partner.microsoftonline.cn/{aad-tenant}/.well-known/openid-configuration" /> 的值与JWT Token中的值步一致而引起的验证失败。 解析Token的值可以使用在线工具:https://jwt.io/. 如:

【Azure API 管理】在 Azure API 管理中使用 OAuth 2.0 授权和 Azure AD 保护 Web API 后端,在请求中携带Token访问后报401的错误

通过解析Token值后,对比错误消息。找出是否不一致的问题。可以在AAD中修改,也可以在API的Policy中修改。

【Azure API 管理】在 Azure API 管理中使用 OAuth 2.0 授权和 Azure AD 保护 Web API 后端,在请求中携带Token访问后报401的错误

附录:配置OAuth 2.0 的三个重要步骤

一:在 Azure AD 中授予权限

注册了用于表示 API 和开发人员控制台的两个应用程序之后,请授予权限以允许客户端应用调用后端应用。

  1. 搜索并选择“应用注册”。

  2. 然后,在应用的页面列表中,选择“API 权限”。

  3. 选择“添加权限”。

  4. 在“选择 API”下,选择“我的 API”,然后找到并选择你的 backend-app。

  5. 在“委托的权限”下,选择对 backend-app 的适当权限,然后选择“添加权限”。

  6. (可选)在“API 权限”页上,选择“授予对 <your-tenant-name> 的管理员许可”,为此目录中的所有用户授予许可。

二:在开发人员门户中启用 OAuth 2.0 用户授权

此时,我们已在 Azure AD 中创建应用程序,并已授予适当的权限来让客户端应用调用后端应用。

以下步骤说明如何在开发人员门户中启用 OAuth 2.0 用户授权

  1. 在 Azure 门户中,浏览找到你的 API 管理实例。

  2. 选择“OAuth 2.0” > “添加”。

  3. 提供“显示名称”和“说明”。

  4. 在此示例中,用户不创建和配置自己的帐户,因此使用了占位符。

  5. 选择“授权代码”作为“授权类型”。

  6. 再次浏览到“应用注册”页,并选择“终结点”。

  7. 选择“授权”请求方法下的“POST”。

  8. 复制“OAuth 2.0 令牌终结点”,并将其粘贴到“令牌终结点 URL”文本框。

     重要

    我们建议使用 v2 终结点。

  9. 使用后端应用的“应用程序 ID”作为此参数的值。

  10. accessTokenAcceptedVersion 属性的值设置为 2

  11. 这些是 client-app 的凭据。

  12. 对于“客户端 ID”,请使用客户端应用的“应用程序 ID”。

  13. 对于“客户端机密”,请使用前面为 client-app 创建的密钥。

  14. 记下此 URL。

  15. 选择“创建” 。

  16. 返回到 Azure Active Directory 中的客户端应用注册,并选择“身份验证”。

  17. 在“平台配置”下,单击“添加平台”,然后选择“Web”作为类型,将“redirect_url”粘贴在“重定向 URI”下,然后单击“配置”按钮进行保存。

配置 OAuth 2.0 授权服务器后,开发人员控制台可从 Azure AD 获取访问令牌。

这使得开发人员控制台知道在调用 API 之前,需要代表用户获取访问令牌。

  1. 浏览到 API 管理实例,并转到“API”。

  2. 例如,Echo API

  3. 转到“设置”。

  4. 在“安全性”下,选择“OAuth 2.0”并选择前面配置的 OAuth 2.0 服务器。

  5. 选择“保存” 。

三: 配置 JWT 验证策略,对请求进行预授权

开发人员控制台将代表用户获取访问令牌,并在对 API 发出的请求中包含该令牌。

它只是将 Authorization 标头传递给后端 API。

设置或编辑策略。

<validate-jwt header-name="Authorization" failed-validation-httpcode="401" failed-validation-error-message="Unauthorized. Access token is missing or invalid.">
    <openid-config url="https://login.partner.microsoftonline.cn/{aad-tenant}/.well-known/openid-configuration" />
    <required-claims>
        <claim name="aud">
            <value>{Application ID of backend-app}</value>
        </claim>
    </required-claims>
</validate-jwt>

备注

对于 v2 openid-config 终结点,请使用以下 URL:

https://login.partner.microsoftonline.cn/common/v2.0/.well-known/openid-configuration.

参考文档

https://docs.azure.cn/zh-cn/api-management/api-management-howto-protect-backend-with-aad

验证 JWT: https://docs.microsoft.com/zh-cn/azure/api-management/api-management-access-restriction-policies#validate-jwt