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

使用访问密钥或共享访问签名对 Azure 事件网格客户端进行身份验证(预览)

本文介绍了如何使用访问密钥或共享访问签名 (SAS) 令牌对 Azure 事件命名空间主题、自定义主题、域和合作伙伴命名空间的客户端进行身份验证

重要

  • 与基于密钥的共享访问签名 (SAS) 身份验证方式相比,使用 Microsoft Entra 标识对用户或应用程序进行身份验证和授权提供了更高的安全性和易用性。 使用 Microsoft Entra ID,不需要在代码中存储用于身份验证的机密,也不需要冒出现潜在安全漏洞的风险。 强烈建议在应用程序中使用 Microsoft Entra ID。

使用访问密钥进行身份验证

访问密钥身份验证是最简单的身份验证形式。 可以将访问密钥作为 HTTP 标头或 URL 查询参数传递。

HTTP 标头中的访问密钥

将访问密钥作为 HTTP 标头的值传递:aeg-sas-key

aeg-sas-key: XXXXXXXXXXXXXXXXXX0GXXX/nDT4hgdEj9DpBeRr38arnnm5OFg==

用作查询参数的访问密钥

还可以将 aeg-sas-key 指定为查询参数。

例如,对于命名空间主题,在将键作为参数传递时,HTTP 请求 URL 可能这样显示。

https://<namespace_name>.<region>.eventgrid.azure.net/topics/<topic_name>:publish?aeg-sas-key=XXXXXXXX53249XX8XXXXX0GXXX/nDT4hgdEj9DpBeRr38arnnm5OFg==

对于自定义主题、域和合作伙伴命名空间,HTTP 请求 URL 应如下所示:

https://<yourtopic>.<region>.eventgrid.azure.net/api/events?aeg-sas-key=XXXXXXXX53249XX8XXXXX0GXXX/nDT4hgdEj9DpBeRr38arnnm5OFg==

共享访问签名

共享访问签名 (SAS) 可提供对可与客户端通信的资源的访问控制。 下面是可以在 SAS 中设置的一些控制措施:

  • 设置 SAS 过期时间。 该值有效定义了 SAS 可用于身份验证的有效时间间隔。
  • 可以使用 SAS 的资源。 可以创建 SAS 令牌来访问自定义主题、域、合作伙伴命名空间和命名空间。 如果为自定义主题、域或合作伙伴命名空间创建了 SAS,客户端可以使用它向这些资源中的任何一个发布事件。 为命名空间资源创建 SAS 时,可以精细控制客户端可以访问的内容。 如果创建的 SAS 的资源是一个命名空间,客户端可以向命名空间内的任何命名空间主题发布事件,并从命名空间任何主题上的任何事件订阅中接收事件。 同样,为命名空间主题创建 SAS 时,客户端可以向该命名空间主题发布事件,并从该主题上的任何事件订阅中接收事件。 为事件订阅创建 SAS 后,客户端可以通过该事件订阅接收事件。
  • 只有提供有效 SAS 的客户端才能向事件网格发送或接收数据。

共享访问签名令牌

可以生成一个 SAS 令牌,在客户端应用程序与事件网格通信时将其包含在内。 事件网格资源的 SAS 令牌为 URL 编码字符串,格式如下:r={resource}&e={expiration_utc}&s={signature}

  • {resource} 是表示客户端访问的事件网格资源的 URL。
    • 自定义主题、域和合作伙伴命名空间的有效 URL 格式是 https://<yourtopic>.<region>.eventgrid.azure.net/api/events
    • 命名空间资源的有效格式如下所示:
      • 命名空间:https://<namespace-name>.<region>.eventgrid.azure.net
      • 命名空间主题:https://<namespace_name>.<region>.eventgrid.azure.net/topics/<topic_name>
      • 事件订阅:https://<namespace_name>.<region>.eventgrid.azure.net/topics/<topic_name>/eventsubscriptions/<event_subscription_name>
  • {expiration_utc} 是 SAS 的 URL 编码 UTC 过期时间。
  • {signature} 是根据资源 URI 和令牌到期时间的字符串表示计算的 SHA-256 哈希,用 CRLF 分隔。 哈希计算方式如以下虚拟代码所示,返回 256 位/32 字节哈希值。
SHA-256('https://<namespace_name>.eventgrid.azure.net/'+'\n'+ 1438205742)

令牌包含非哈希值,这样接收方(事件网格)可以用相同的参数重新计算哈希,验证令牌是否未被修改(数据完整性)。

SAS 令牌对于以 signature-string 中使用的资源 URI 为前缀的所有资源有效。

要在使用事件网格时查阅所有支持的 API 版本,请参阅 Microsoft.EventGrid 资源类型

使用 SAS 进行身份验证

应用程序可以通过提供 SAS 令牌对事件网格资源进行身份验证。 这可以通过在 HTTP 请求中使用 aeg-sas-token 标头或 Authorization SharedAccessSignature 标头来实现。 以下部分将介绍生成 SAS 令牌的方法,以及如何在客户端应用程序发出 HTTP 请求以发送或接收(拉取交付)事件时使用它。

以编程方式生成 SAS 令牌

以下 C# 和 Python 示例演示如何创建用于事件网格的 SAS 令牌:

C# 示例

static string BuildSharedAccessSignature(string resource, DateTime expirationUtc, string key)
{
    const char Resource = 'r';
    const char Expiration = 'e';
    const char Signature = 's';

    string encodedResource = HttpUtility.UrlEncode(resource);
    var culture = CultureInfo.CreateSpecificCulture("en-US");
    var encodedExpirationUtc = HttpUtility.UrlEncode(expirationUtc.ToString(culture));

    string unsignedSas = $"{Resource}={encodedResource}&{Expiration}={encodedExpirationUtc}";
    using (var hmac = new HMACSHA256(Convert.FromBase64String(key)))
    {
        string signature = Convert.ToBase64String(hmac.ComputeHash(Encoding.UTF8.GetBytes(unsignedSas)));
        string encodedSignature = HttpUtility.UrlEncode(signature);
        string signedSas = $"{unsignedSas}&{Signature}={encodedSignature}";

        return signedSas;
    }
}

Python 示例

def generate_sas_token(uri, key, expiry=3600):
    ttl = datetime.datetime.utcnow() + datetime.timedelta(seconds=expiry)
    encoded_resource = urllib.parse.quote_plus(uri)
    encoded_expiration_utc = urllib.parse.quote_plus(ttl.isoformat())

    unsigned_sas = f'r={encoded_resource}&e={encoded_expiration_utc}'
    signature = b64encode(HMAC(b64decode(key), unsigned_sas.encode('utf-8'), sha256).digest())
    encoded_signature = urllib.parse.quote_plus(signature)
    
    token = f'r={encoded_resource}&e={encoded_expiration_utc}&s={encoded_signature}'

    return token

使用 aeg-sas-token 标头

以下示例演示如何将 SAS 令牌作为 aeg-sas-token 标头的值传递。

aeg-sas-token: r=https%3a%2f%2fmytopic.eventgrid.azure.net%2fapi%2fevents&e=6%2f15%2f2017+6%3a20%3a15+PM&s=XXXXXXXXXXXXX%2fBPjdDLOrc6THPy3tDcGHw1zP4OajQ%3d

使用 Authorization 标头

此示例演示如何将 SAS 令牌作为 Authorization 标头的值传递。

Authorization: SharedAccessSignature r=https%3a%2f%2fmytopic.eventgrid.azure.net%2fapi%2fevents&e=6%2f15%2f2017+6%3a20%3a15+PM&s=XXXXXXXXXXXXX%2fBPjdDLOrc6THPy3tDcGHw1zP4OajQ%3d

后续步骤