共用方式為


在 API 管理中保護 MCP 伺服器的存取

適用於:開發人員 |基本 |基本 v2 |標準 |標準 v2 |Premium |進階 v2

透過 API 管理中的 MCP 伺服器支援,您可以公開及控管 MCP 伺服器及其工具的存取權。 本文說明如何保護對 API 管理中管理之 MCP 伺服器的存取,包括從受控 REST API 公開的 MCP 伺服器,以及裝載於 API 管理外部的現有 MCP 伺服器。

您可以保護 MCP 伺服器的輸入存取權(從 MCP 用戶端到 API 管理),以及輸出存取權(從 API 管理到 MCP 伺服器)。

保護輸入存取

金鑰型驗證

如果 MCP 伺服器受到透過標頭傳入 Ocp-Apim-Subscription-Key 的 API 管理訂用帳戶密鑰保護,MCP 用戶端可以在傳入要求中呈現金鑰,而 MCP 伺服器可以驗證金鑰。 例如,在 Visual Studio Code 中,您可以將區 headers 段新增至 MCP 伺服器組態,以要求標頭中要求訂用帳戶密鑰:

{
  "name": "My MCP Server",
  "type": "remote",
  "url": "https://my-api-management-instance.azure-api.net/my-mcp-server",    
  "transport": "streamable-http",
  "headers": {
    "Ocp-Apim-Subscription-Key": "<subscription-key>"
  }
}

備註

使用 Visual Studio Code 工作區設定或安全輸入安全地管理訂用帳戶密鑰。

令牌型驗證 (具有Microsoft Entra 標識符的 OAuth 2.1)

MCP 用戶端可以使用標頭來呈現由Microsoft Entra ID Authorization 所簽發的 OAuth 令牌或 JWT,並由 API 管理驗證。

例如,使用 validate-azure-ad-token 原則來驗證Microsoft Entra ID 令牌:

<validate-azure-ad-token tenant-id="your-entra-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>your-client-application-id</application-id>
    </client-application-ids> 
</validate-azure-ad-token>

將令牌轉寄至後端

請求標頭會自動(但有特定排除)轉發至 MCP 工具調用,簡化了與依賴標頭進行路由、上下文或認證的下游 API 整合。

如果你需要明確轉發 Authorization 標頭來驗證收到的請求,你可以採用以下其中一種方法:

  • 在 API 設定中明確定義為 Authorization 必要的標頭,並在原則中 Outbound 轉送標頭。

    範例原則代碼段:

    <!-- Forward Authorization header to backend --> 
    <set-header name="Authorization" exists-action="override"> 
        <value>@(context.Request.Headers.GetValueOrDefault("Authorization"))</value> 
    </set-header> 
    
  • 使用 API 管理認證管理員和原則 (get-authorization-contextset-header) 安全地轉送令牌。 如需詳細資訊,請參閱 保護輸出存取

如需更多輸入授權選項和範例,請參閱:

保護輸出存取

使用 API 管理的 認證管理員 ,為 MCP 伺服器工具提出的後端 API 要求安全地插入 OAuth 2.0 令牌。

設定 OAuth 2 型輸出存取的步驟

步驟 1: 在識別提供者中註冊應用程式。

步驟 2: 在連結至識別提供者的 API 管理中建立認證提供者。

步驟 3: 設定認證管理員內的連線。

步驟 4: 套用 API 管理原則以動態擷取和附加認證。

例如,下列原則會從認證管理員擷取存取令牌,並在傳出要求的標頭中 Authorization 設定它:

<!-- Add to inbound policy. -->
<get-authorization-context
    provider-id="your-credential-provider-id" 
    authorization-id="auth-01" 
    context-variable-name="auth-context" 
    identity-type="managed" 
    ignore-error="false" />
<!-- Attach the token to the backend call -->
<set-header name="Authorization" exists-action="override">
    <value>@("Bearer " + ((Authorization)context.Variables.GetValueOrDefault("auth-context"))?.AccessToken)</value>
</set-header>

如需使用認證管理員中產生的認證呼叫範例後端的逐步指南,請參閱 設定認證管理員 - GitHub