次の方法で共有


アクセス キーまたは Shared Access Signature を使用して Azure Event Grid クライアントを認証する

この記事では、アクセス キーまたは Shared Access Signature (SAS) トークンを使用して、Azure Event Grid 名前空間のトピック、カスタム トピック、ドメイン、パートナー名前空間に対してクライアントを認証する方法について説明します。

重要

  • Microsoft Entra の ID を使用したユーザーやアプリケーションの認証および承認は、キー ベースや Shared Access Signatures (SAS) の認証よりも優れたセキュリティと使いやすさを提供します。 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==

Shared Access Signature

Shared Access Signature (SAS) を使用すると、クライアントが通信できるリソースに対するアクセス制御が提供されます。 SAS で設定できる制御をいくつかを以下に示します。

  • SAS の有効期限を設定します。 この値は、実質的に、SAS が有効で認証に使用できる間隔を定義します。
  • SAS を使用できるリソース。 SAS トークンを作成して、カスタム トピック、ドメイン、パートナー名前空間、名前空間にアクセスできます。 カスタム トピック、ドメイン、またはパートナー名前空間の SAS を作成する場合、クライアントはそれを使用して、それらのリソースのいずれかにイベントを発行できます。 名前空間リソースの SAS を作成すると、クライアントがアクセスできる対象をきめ細かく制御できます。 リソースが名前空間である SAS を作成すると、クライアントはその名前空間内の任意の名前空間トピックにイベントを発行でき、任意の名前空間のトピックの任意のイベント サブスクリプションからイベントを受信できます。 同様に、名前空間トピックの SAS を作成すると、クライアントはその名前空間トピックにイベントを発行し、そのトピック上の任意のイベント サブスクリプションからイベントを受信できます。 イベント サブスクリプションの SAS が作成されると、クライアントはそのイベント サブスクリプションを介してイベントを受信できます。
  • 有効な SAS を提示するクライアントのみが、Event Grid に対してデータを送受信できます。

Shared Access Signature トークン

クライアント アプリケーションが Event Grid と通信するときに含める SAS トークンを生成できます。 Event Grid リソースの SAS トークンは、次の形式で URL エンコードされた文字列です。r={resource}&e={expiration_utc}&s={signature}

  • {resource} は、クライアントがアクセスする Event Grid リソースを表す 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 とトークンの有効期限の文字列表現を CRLF で区切ったものに対して計算された SHA-256 ハッシュです。 ハッシュ計算は次の擬似コードのようなもので、256 ビット/32 バイトのハッシュ値を返します。
SHA-256('https://<namespace_name>.eventgrid.azure.net/'+'\n'+ 1438205742)

受信側 (Event Grid) が同じパラメーターでハッシュを再計算して、トークンが変更されていないことを検証できるように (データ整合性)、トークンにはハッシュされていない値が含まれています。

SAS トークンは、署名文字列で使われているリソース URI がプレフィックスになっているすべてのリソースで有効です。

Event Grid を使用する場合にサポートされるすべての API バージョンについては、「Microsoft.EventGrid リソースの種類」を参照してください。

SAS を使用して認証する

アプリケーションは、SAS トークンを提示することで、Event Grid リソースの前に認証できます。 これを行うには、HTTP 要求で aeg-sas-token ヘッダーまたは Authorization SharedAccessSignature ヘッダーを使用します。 次のセクションでは、SAS トークンを生成する方法と、クライアント アプリケーションが HTTP 要求を行ってイベントを送信または受信 (プル配信) するときにそのトークンを使用する方法について説明します。

プログラムで SAS トークンを生成する

次の C# と Python の例は、Event Grid で使用する 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 ヘッダーの使用

aeg-sas-token ヘッダーの値として SAS トークンを渡す方法を示す例を次に示します。

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 ヘッダーの使用

Authorization ヘッダーの値として SAS トークンを渡す方法を示す例を次に示します。

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

次のステップ