你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

使用 Azure API 管理对 LLM API 的访问权限进行身份验证和授权

适用于:所有 API 管理层级

本文介绍如何对 Azure API 管理管理的 AI API 终结点进行身份验证和授权。 本文介绍以下常见方法:

  • 身份验证 - 使用 API 密钥或 Microsoft Entra ID 托管标识的策略向 AI API 进行身份验证。

  • 授权 - 如需更精细的访问控制,请预先授权传递由标识提供者(如 Microsoft Entra ID)生成的 OAuth 2.0 令牌的请求。

有关背景信息,请参阅:

先决条件

若要遵循本文中的示例,必须具备:

使用 API 密钥进行身份验证

向 AI API 进行身份验证的默认方法是使用 API 密钥。 对于这种类型的身份验证,所有 API 请求都必须在 HTTP 标头中包含有效的 API 密钥。 标头名称取决于 API。 例如,Microsoft Foundry API 中的 Azure OpenAI 使用 api-key 标头。

  • API 管理可以使用 命名值以安全的方式管理 API 密钥。
  • 可以在 API 策略中引用命名值,以在发往 API 的请求中设置 api-key 标头。 以下两个示例演示如何执行此作:一个示例使用 set-backend-service 策略,另一个使用 set-header 策略。

将 API 密钥存储在命名值中

下面是如何在 API 管理中的命名值中存储 Azure OpenAI API 密钥的示例:

  1. 从 AI 模型部署获取 API 密钥。 对于 Azure OpenAI 模型部署,请在 Microsoft Foundry 门户中 的项目主页上 找到此信息。
  2. 转到 API Management 实例,然后在左侧菜单中选择“命名值”
  3. 选择 “+ 添加”,并将该值添加为机密。 为了获得更多安全性,可以选择使用 密钥保管库引用

在 API 请求中传递 API 密钥 - set-backend-service 策略

  1. 创建指向 Azure OpenAI API 的后端

    1. 在 API Management 实例的左侧菜单中,选择“后端”
    2. 选择“+ 添加”,然后输入后端的描述性名称。 示例:openai-backend
    3. 在“类型”下,选择“自定义”,然后输入 Azure OpenAI 终结点的 URL。 示例:https://contoso.services.ai.azure.com/openai
    4. 在“授权凭据”下,选择“标头”,并输入 api-key 作为标头名称,输入命名值作为值。
    5. 选择 创建
  2. inbound 策略部分中添加以下 set-backend-service 策略代码段,以将请求中的 API 密钥传递给 Azure OpenAI API。

    在此示例中,后端资源为 openai-backend

    <set-backend-service backend-id="openai-backend" />
    

在 API 请求中传递 API 密钥 - set-header 策略

或者,在 inbound 策略部分中添加以下 set-header 策略代码段,以将请求中的 API 密钥传递给 Azure OpenAI API。 此策略代码段使用你设置的命名值来设置 api-key 标头。

在此示例中,API Management 中的命名值是 openai-api-key

<set-header name="api-key" exists-action="override">
    <value>{{openai-api-key}}</value>
</set-header>

使用托管标识进行身份验证

对于 Microsoft Foundry 中的 Azure OpenAI 和其他模型部署,请使用 Microsoft Entra ID 中的托管标识进行身份验证。 有关背景信息,请参阅 如何使用 Microsoft Entra ID 身份验证在 Microsoft Foundry 模型中配置 Azure OpenAI

按照以下步骤将 API 管理实例配置为使用托管标识进行身份验证。

  1. 为 API Management 实例启用系统分配或用户分配的托管标识。 以下示例假定你启用了实例的系统分配的托管标识。

  2. 为托管标识分配“认知服务 OpenAI 用户”角色,该角色的范围限定为相应的资源。 例如,为系统分配的托管标识分配 Microsoft Foundry 资源上的“认知服务 OpenAI 用户”角色。 有关详细步骤,请参阅“Azure OpenAI 服务的基于角色的访问控制”

  3. 在策略部分中添加以下策略代码片段 inbound ,以使用托管标识对 API 的请求进行身份验证。

    在本示例中:

    <authentication-managed-identity resource="https://cognitiveservices.azure.com" output-token-variable-name="managed-id-access-token" ignore-error="false" /> 
    <set-header name="Authorization" exists-action="override"> 
        <value>@("Bearer " + (string)context.Variables["managed-id-access-token"])</value> 
    </set-header> 
    

小窍门

而不是使用此示例中显示的authentication-managed-identityset-header策略,你可以配置一个将 API 请求定向到 AI 服务终结点的后端资源。 在后端配置中,将托管标识凭据配置到 https://cognitiveservices.azure.com/ 资源。 直接从 Microsoft Foundry 导入 API 时,Azure API 管理会自动执行这些步骤。

使用标识提供者进行 OAuth 2.0 授权

若要允许特定用户或客户端对 Azure OpenAPI 或其他 LLM API 进行更精细的访问,请使用具有 Microsoft Entra ID 或其他标识提供者的 OAuth 2.0 授权对 API 进行预授权访问。 有关背景信息,请参阅“使用 OAuth 2.0 授权和 Microsoft Entra ID 保护 Azure API Management 中的 API”

注释

使用 OAuth 2.0 授权作为深层防御策略的一部分。 它不能替代 API 密钥身份验证或 Azure OpenAI API 的托管标识身份验证。

以下步骤演示如何限制对使用标识提供者授权的用户或应用进行 API 访问。

  1. 在标识提供者中创建一个应用程序,以在 Azure API 管理中表示 AI API。 如果使用 Microsoft Entra ID,请在 Microsoft Entra ID 租户中注册一个应用程序。 记录应用程序 ID 和受众 URI 等详细信息。

    根据需要,将应用程序配置为具有代表访问 AI API 所需的精细权限的角色或范围。

  2. 在 API Management 实例中添加策略 inbound 片段,以验证表示 Authorization 标头中存在 JSON Web 令牌 (JWT) 的请求。 将此代码段置于设置为向 Azure OpenAI API 进行身份验证的其他 inbound 策略之前

    注释

    以下示例演示用于验证 JWT 的策略的一般结构。 将其自定义为标识提供者以及应用程序和 API 的要求。

    • validate-azure-ad-token - 如果使用 Microsoft Entra Id,请配置 validate-azure-ad-token 策略以验证 JWT 中的受众和声明。 有关详细信息,请参阅“策略参考”

      <validate-azure-ad-token tenant-id={{TENANT_ID}} header-name="Authorization" failed-validation-httpcode="401" failed-validation-error-message="Unauthorized. Access token is missing or invalid.">
          <client-application-ids>
                  <application-id>{{CLIENT_APP_ID}}</application-id>
          </client-application-ids>
         <audiences>
              <audience>...</audience> 
          </audiences>
          <required-claims>
              <claim name=...>
                  <value>...</value>
              </claim>
          </required-claims>
      </validate-azure-ad-token>
      
    • validate-jwt - 如果使用其他标识提供者,请配置 validate-jwt 策略以验证 JWT 中的受众和声明。 有关详细信息,请参阅“策略参考”

      <validate-jwt header-name="Authorization" failed-validation-httpcode="401" failed-validation-error-message="Unauthorized. Access token is missing or invalid.">
          <openid-config url={{OPENID_CONFIGURATION_URL}} />
          <issuers>
              <issuer>{{ISSUER_URL}}</issuer>
          </issuers>
          <audiences>
              <audience>...</audience> 
          </audiences>
          <required-claims>
              <claim name=...>
                  <value>...</value>
              </claim>
          </required-claims>
      </validate-jwt>