使用存取金鑰或共用存取簽章驗證 Azure 事件方格發佈用戶端

本文提供驗證用戶端的資訊,這些用戶端會使用存取金鑰共用存取簽章 (SAS) 權杖,將事件發佈至 Azure 事件方格主題、網域、合作夥伴命名空間。

重要

  • 使用 Microsoft Entra 身分識別驗證和授權使用者或應用程式,可透過金鑰型和共用存取簽章 (SAS),提供更佳安全性和方便使用度。 使用 Microsoft Entra ID 不需要冒著潛在安全性弱點的風險,在程式碼中儲存用於驗證的祕密。 強烈建議您搭配 Azure 事件方格事件發佈應用程式使用 Microsoft Entra ID。 如需詳細資訊,請參閱使用 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.net/api/events?aeg-sas-key=XXXXXXXX53249XX8XXXXX0GXXX/nDT4hgdEj9DpBeRr38arnnm5OFg==

如需如何取得主題或網域存取金鑰的指示,請參閱取得存取金鑰 (機器翻譯)

使用 SAS 進行驗證

事件方格的 SAS 權杖包含資源、過期時間及簽章。 SAS 權杖的格式為:r={resource}&e={expiration}&s={signature}

這裡的資源是您傳送事件目標事件方格主題的路徑。 以下為一個有效資源路徑的例子:https://<yourtopic>.<region>.eventgrid.azure.net/api/events。 若要查看所有支援的 API 版本,請參閱 Microsoft.EventGrid 資源類型

首先,以程式設計方式產生 SAS 權杖,然後使用 aeg-sas-token 標頭或 Authorization SharedAccessSignature 標頭,向事件方格驗證。

以程式設計方式產生 SAS 權杖

下列範例建立了供 Event Grid 使用的 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.net%2fapi%2fevents&e=6%2f15%2f2017+6%3a20%3a15+PM&s=XXXXXXXXXXXXX%2fBPjdDLOrc6THPy3tDcGHw1zP4OajQ%3d

使用授權標頭

以下是將 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

下一步

請參閱事件傳遞驗證 (機器翻譯),了解使用事件處理常式進行驗證以傳遞事件。