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

本文介绍使用访问密钥或共享访问签名 (SAS) 令牌对那些将事件发布到 Azure 事件网格主题、域、合作伙伴命名空间的客户端进行身份验证。

重要

  • 与基于密钥的共享访问签名 (SAS) 身份验证方式相比,使用 Microsoft Entra 标识对用户或应用程序进行身份验证和授权提供了更高的安全性和易用性。 使用 Microsoft Entra ID,不需要在代码中存储用于身份验证的机密,也不需要冒出现潜在安全漏洞的风险。 强烈建议将 Microsoft Entra ID 与 Azure 事件网格事件发布应用程序配合使用。 有关详细信息,请参阅使用 Azure Microsoft Entra ID 对发布客户端进行身份验证
  • 命名空间主题不支持 Microsoft Entra 身份验证。

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

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

HTTP 标头中的访问密钥

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

aeg-sas-key: XXXXXXXXXXXXXXXXXX0GXXX/nDT4hgdEj9DpBeRr38arnnm5OFg==

用作查询参数的访问密钥

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

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

有关如何获取主题或域的访问密钥的说明,请参阅获取访问密钥

使用 SAS 进行身份验证

事件网格资源的 SAS 令牌包括资源、过期时间和签名。 SAS 令牌的格式是:r={resource}&e={expiration}&s={signature}

资源是要将事件发送到的事件网格主题的路径。 例如,有效的资源路径是 https://<yourtopic>.<region>.eventgrid.azure.cn/api/events。 若要查看所有受支持的 API 版本,请参阅 Microsoft.EventGrid 资源类型

首先,以编程方式生成 SAS 令牌,然后使用 aeg-sas-token 标头或 Authorization SharedAccessSignature 标头向事件网格进行身份验证。

以编程方式生成 SAS 令牌

以下示例会创建用于事件网格的 SAS 令牌:

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;
    }
}
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.cn%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.cn%2fapi%2fevents&e=6%2f15%2f2017+6%3a20%3a15+PM&s=XXXXXXXXXXXXX%2fBPjdDLOrc6THPy3tDcGHw1zP4OajQ%3d

后续步骤

请参阅事件传递身份验证,了解如何使用事件处理程序进行身份验证以传递事件。