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

向直接管理 Azure API 管理 REST API 进行身份验证

本指南介绍如何创建访问令牌 (SAS 令牌) 调用直接管理 Azure API 管理 REST API 所需的。

有关访问直接管理 REST API 的授权和其他先决条件的详细信息,请参阅直接管理API 管理 REST API

重要

SAS 令牌访问只能应用于直接管理 API 调用,例如: https://apim-instance.management.azure-api.net/ /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ApiManagement/service/{serviceName}/apis?api-version=2021-08-01。 不能将其用于对 Azure 资源管理器的 API 调用。

手动创建 SAS 令牌

  1. Azure 门户中导航到自己的 Azure API 管理实例。

  2. 从左侧菜单的“部署 + 基础结构”部分选择“管理 API”。

    在Azure 门户中选择“管理 API”

  3. “启用API 管理 REST API”中,选择“”。

    重要

    如果未选择“启用API 管理 REST API”,则对该服务实例的 REST API 的调用将失败。

    在 Azure 门户 中启用 API 管理 API

  4. 在“过期”文本框中指定访问令牌的过期日期和时间。 此值必须采用 MM/DD/YYYY H:MM PM|AM 格式。

    在Azure 门户中为API 管理 REST API 生成访问令牌

  5. 在“密钥”下拉列表中选择“ 主密钥 ”或“辅助密钥”。 这些密钥提供等效的访问权限;使用两个密钥可以实现灵活的密钥管理策略。

  6. 选择“ 生成 ”以创建访问令牌。

  7. 复制整个访问令牌,并在对 API 管理 REST API 发出的每个请求的 Authorization 标头中提供该令牌,如以下示例中所示。

    Authorization: SharedAccessSignature integration&201808020500&aAsTE43MAbKMkZ6q83Z732IbzesfsaPEU404oUjQ4ZLE9iIXLz+Jj9rEctxKYw43SioCfdLaDq7dT8RQuBKc0w==
    

以编程方式创建 SAS 令牌

  1. 采用以下格式构造字符串以签名:

    {identifier} + "\n" + {expiry}

    其中:
    identifier- Azure API 管理 实例的“管理 API”选项卡中的“标识符”字段的值 (请参阅上一部分,了解) 的详细信息。
    expiry - 所需的 SAS 令牌到期日期。

  2. 通过使用主密钥或辅助密钥向 string-to-sign 应用 HMAC-SHA512 哈希函数来生成签名。

  3. 将对返回的签名密钥进行 Base64 编码。

  4. 使用以下格式创建访问令牌。

    uid={identifier}&ex={expiry}&sn={Base64 encoded signature}

    例如:

    uid=53dd860e1b72ff0467030003&ex=2014-08-04T22:03:00.0000000Z&sn=ItH6scUyCazNKHULKA0Yv6T+Skk4bdVmLqcPPPdWoxl2n1+rVbhKlplFrqjkoUFRr0og4wjeDz4yfThC82OjfQ==

  5. 使用这些值在对 API 管理 REST API 发出的每个请求中创建 Authorization 标头,如以下示例中所示。

    Authorization: SharedAccessSignature uid=53dd860e1b72ff0467030003&ex=2014-08-04T22:03:00.0000000Z&sn=ItH6scUyCazNKHULKA0Yv6T+Skk4bdVmLqcPPPdWoxl2n1+rVbhKlplFrqjkoUFRr0og4wjeDz4yfThC82OjfQ==
    

以下示例演示了前面所述的生成访问令牌的步骤。

using System;   
using System.Text;   
using System.Globalization;   
using System.Security.Cryptography;   
  
public class Program   
{   
    public static void Main()   
    {   
        var id = "53d7e14aee681a0034030003";   
        var key = "pXeTVcmdbU9XxH6fPcPlq8Y9D9G3Cdo5Eh2nMSgKj/DWqeSFFXDdmpz5Trv+L2hQNM+nGa704Rf8Z22W9O1jdQ==";   
        var expiry = DateTime.UtcNow.AddDays(10);   
        using (var encoder = new HMACSHA512(Encoding.UTF8.GetBytes(key)))   
        {   
            var dataToSign = id + "\n" + expiry.ToString("O", CultureInfo.InvariantCulture);   
            var hash = encoder.ComputeHash(Encoding.UTF8.GetBytes(dataToSign));   
            var signature = Convert.ToBase64String(hash);   
            var encodedToken = string.Format("SharedAccessSignature uid={0}&ex={1:o}&sn={2}", id, expiry, signature);   
            Console.WriteLine(encodedToken);   
        }   
    }   
}  
  

注意

这两种 SAS 令牌格式都是正确且可接受的:
SharedAccessSignature uid=53dd860e1b72ff0467030003&ex=2014-08-04T22:03:00.0000000Z&sn=ItH6scUyCazNKHULKA0Yv6T+Skk4bdVmLqcPPPdWoxl2n1+rVbhKlplFrqjkoUFRr0og4wjeDz4yfThC82OjfQ==

SharedAccessSignature integration&201808020500&aAsTE43MAbKMkZ6q83Z732IbzesfsaPEU404oUjQ4ZLE9iIXLz+Jj9rEctxKYw43SioCfdLaDq7dT8RQuBKc0w==

有关完整的示例代码,请参阅 API 管理 .NET REST API 示例

后续步骤