.NET を使用して BLOB のサービス SAS を作成する

Shared Access Signature (SAS) を使用すると、ストレージ アカウント内のコンテナーと BLOB への制限付きアクセスを許可できます。 SAS を作成するときに、クライアントがアクセスできる Azure Storage リソース、それらのリソースに対するアクセス許可、SAS の有効期間などの制約を指定します。

すべての SAS はキーによって署名されます。 次の 2 つの方法のいずれかで SAS に署名できます。

  • Microsoft Entra の資格情報を使用して作成されたキーを使用する。 Microsoft Entra の資格情報を使用して署名された SAS は、ユーザー委任 SAS です。 ユーザー委任 SAS を作成するクライアントには、Microsoft.Storage/storageAccounts/blobServices/generateUserDelegationKey アクションを含む Azure RBAC ロールを割り当てる必要があります。 詳細については、「ユーザー委任 SAS の作成」を参照してください。
  • ストレージ アカウント キーを使用する。 サービス SASアカウント SAS は、どちらもストレージ アカウント キーを使用して署名されます。 サービス SAS を作成するクライアントには、アカウント キーへの直接アクセス権を付与するか、Microsoft.Storage/storageAccounts/listkeys/action アクセス許可を割り当てる必要があります。 詳細については、「サービス SAS の作成」または「アカウント SAS の作成」を参照してください。

注意

ユーザー委任 SAS により、ストレージ アカウント キーで署名された SAS のセキュリティが向上します。 Microsoft では、ユーザー委任 SAS を可能な限り使用することを推奨しています。 詳細については、「Shared Access Signatures (SAS) でデータの制限付きアクセスを付与する」を参照してください。

この記事では、ストレージ アカウント キーを使用して、.NET 用の Azure Blob Storage クライアント ライブラリで BLOB のサービス SAS を作成する方法を示します。

サービス SAS について

サービス SAS は、アカウント アクセス キーを使用して署名されます。 StorageSharedKeyCredential クラスを使用して、サービス SAS の署名に使用される資格情報を作成できます。

また、保存されているアクセス ポリシーを使用して、SAS のアクセス許可と期間を定義することもできます。 既存の保存されているアクセス ポリシーの名前が指定されている場合、そのポリシーは、SAS に関連付けられます。 保存されているアクセス ポリシーの詳細については、「保存されているアクセス ポリシーの定義」を参照してください。 保存されているアクセス ポリシーが指定されていない場合は、この記事のコード例に示されている SAS のアクセス許可と期間を定義する方法を参照してください。

BLOB のサービス SAS を作成する

次のコード例は、BLOB リソースのサービス SAS を作成する方法を示しています。 最初に、コードは CanGenerateSasUri プロパティを確認することで、BlobClient オブジェクトが共有キー資格情報で認可されていることを確認します。 次に、BlobSasBuilder クラスを介してサービス SAS を生成し、GenerateSasUri を呼び出して、クライアント オブジェクトとビルダー オブジェクトに基づいてサービス SAS URI を作成します。

public static async Task<Uri> CreateServiceSASBlob(
    BlobClient blobClient,
    string storedPolicyName = null)
{
    // Check if BlobContainerClient object has been authorized with Shared Key
    if (blobClient.CanGenerateSasUri)
    {
        // Create a SAS token that's valid for one day
        BlobSasBuilder sasBuilder = new BlobSasBuilder()
        {
            BlobContainerName = blobClient.GetParentBlobContainerClient().Name,
            BlobName = blobClient.Name,
            Resource = "b"
        };

        if (storedPolicyName == null)
        {
            sasBuilder.ExpiresOn = DateTimeOffset.UtcNow.AddDays(1);
            sasBuilder.SetPermissions(BlobContainerSasPermissions.Read);
        }
        else
        {
            sasBuilder.Identifier = storedPolicyName;
        }

        Uri sasURI = blobClient.GenerateSasUri(sasBuilder);

        return sasURI;
    }
    else
    {
        // Client object is not authorized via Shared Key
        return null;
    }
}

サービス SAS を使用してクライアント オブジェクトを認可する

次のコード例は、サービス SAS を使用して BlobClient オブジェクトを認可する方法を示しています。 このクライアント オブジェクトを使用すると、SAS によって付与されたアクセス許可に基づいて BLOB リソースに対する操作を実行できます。

まず、アカウント アクセス キーで署名された BlobServiceClient オブジェクトを作成します。

string accountName = "<storage-account-name>";
string accountKey = "<storage-account-key";
StorageSharedKeyCredential storageSharedKeyCredential =
    new(accountName, accountKey);
BlobServiceClient blobServiceClient = new BlobServiceClient(
    new Uri($"https://{accountName}.blob.core.windows.net"),
    storageSharedKeyCredential);

次に、前の例に示すようにサービス SAS を生成し、その SAS を使用して BlobClient オブジェクトを承認します。

// Create a Uri object with a service SAS appended
BlobClient blobClient = blobServiceClient
    .GetBlobContainerClient("sample-container")
    .GetBlobClient("sample-blob.txt");
Uri blobSASURI = await CreateServiceSASBlob(blobClient);

// Create a blob client object representing 'sample-blob.txt' with SAS authorization
BlobClient blobClientSAS = new BlobClient(blobSASURI);

保存されているアクセス ポリシーの定義

保存されているアクセス ポリシーを使用すると、サーバー側でのサービス レベルの共有アクセス署名 (SAS) をさらに細かく制御できます。 保存されているアクセス ポリシーを設定することで、共有アクセス署名をグループ化し、ポリシーによって規定された署名を詳細に制限できます。

保存されているアクセス ポリシーを使用して、署名の開始時刻、有効期限、アクセス許可を変更できます。 保存されているアクセス ポリシーを使用して、発行済みの署名を取り消すこともできます。 このセクションでは BLOB コンテナーに焦点を当てていますが、保存されたアクセス ポリシーは、ファイル共有、キュー、テーブルでもサポートされています。

コンテナー リソースに保存されているアクセス ポリシーを管理するには、BlobContainerClient オブジェクトから次のいずれかのメソッドを呼び出します。

保存されているアクセス ポリシーを作成または変更する

リソースには、一度に 5 つまでアクセス ポリシーを設定できます。 各 SignedIdentifier フィールドが一意の Id フィールドを持ち、1 つのアクセス ポリシーに対応しています。 一度に 5 つより多いアクセス ポリシーを設定しようとすると、サービスから状態コード 400 (Bad Request) が返されます。

次のコード例は、コンテナー リソースに保存されるアクセス ポリシーを 2 つ作成する方法を示しています。

public static async Task CreateStoredAccessPolicyAsync(BlobContainerClient containerClient)
{
    // Create a stored access policy with read and write permissions, valid for one day
    List<BlobSignedIdentifier> signedIdentifiers = new List<BlobSignedIdentifier>
    {
        new BlobSignedIdentifier
        {
            Id = "sample-read-write-policy",
            AccessPolicy = new BlobAccessPolicy
            {
                StartsOn = DateTimeOffset.UtcNow,
                ExpiresOn = DateTimeOffset.UtcNow.AddDays(1),
                Permissions = "rw"
            }
        },
        new BlobSignedIdentifier
        {
            Id = "sample-read-policy",
            AccessPolicy = new BlobAccessPolicy
            {
                StartsOn = DateTimeOffset.UtcNow,
                ExpiresOn = DateTimeOffset.UtcNow.AddDays(1),
                Permissions = "r"
            }
        }
    };

    // Set the container's access policy
    await containerClient.SetAccessPolicyAsync(permissions: signedIdentifiers);
}

既存のポリシーを変更することもできます。 次のコード例は、1 つの保存されているアクセス ポリシーを変更し、ポリシーの有効期限を更新する方法を示しています。

public static async Task ModifyStoredAccessPolicyAsync(BlobContainerClient containerClient)
{
    BlobContainerAccessPolicy accessPolicy = await containerClient.GetAccessPolicyAsync();
    List<BlobSignedIdentifier> signedIdentifiers = accessPolicy.SignedIdentifiers.ToList();

    // Modify the expiration date a single policy
    var samplePolicy = signedIdentifiers.FirstOrDefault(item => item.Id == "sample-read-policy");
    samplePolicy.AccessPolicy.PolicyExpiresOn = DateTimeOffset.UtcNow.AddDays(7);

    // Update the container's access policy
    await containerClient.SetAccessPolicyAsync(permissions: signedIdentifiers);
}

保存されているアクセス ポリシーを取り消す、または削除する

保存されているアクセス ポリシーを取り消すには、それを削除するか、署名された識別子を変更することで名前を変更するか、有効期限を過去の値に変更します。 署名対象の識別子を変更すると、既存の署名と保存されているアクセス ポリシーとの関連付けが解除されます。 有効期限を過去の値に変更すると、関連付けられているすべての署名が期限切れになります。 保存されたアクセス ポリシーを削除したり変更したりするとすぐに、それに関連付けられているすべての共有アクセス署名に影響が及びます。

次のコード例は、署名付き識別子の Id プロパティを変更してポリシーを取り消す方法を示しています。

public static async Task RevokeStoredAccessPolicyAsync(BlobContainerClient containerClient)
{
    BlobContainerAccessPolicy accessPolicy = await containerClient.GetAccessPolicyAsync();
    List<BlobSignedIdentifier> signedIdentifiers = accessPolicy.SignedIdentifiers.ToList();

    // Revoke a single policy by changing its name
    var samplePolicy = signedIdentifiers.FirstOrDefault(item => item.Id == "sample-read-policy");
    samplePolicy.Id = "sample-read-policy-revoke";

    // Update the container's access policy
    await containerClient.SetAccessPolicyAsync(permissions: signedIdentifiers);
}

空の permissions パラメーターを指定して SetAccessPolicyAsync を呼び出すことで、コンテナー リソースからすべてのアクセス ポリシーを削除することもできます。 次の例は、保存されているすべてのアクセス ポリシーを、指定したコンテナーから削除する方法を示しています。

public static async Task DeleteStoredAccessPolicyAsync(BlobContainerClient containerClient)
{
    // Remove all stored access policies for the container resource
    await containerClient.SetAccessPolicyAsync();
}

リソース

.NET 用の Azure Blob Storage クライアント ライブラリを使用したサービス SAS の作成方法について詳しくは、次のリソースを参照してください。

クライアント ライブラリのリソース

関連項目