.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) でデータの制限付きアクセスを付与する」を参照してください。

この記事では、Microsoft Entra 資格情報を使用し、.NET 用の Azure Storage クライアント ライブラリを使って、BLOB のユーザー委任 SAS を作成する方法を示します。

ユーザー委任 SAS について

コンテナーまたは BLOB にアクセスするための SAS トークンは、Microsoft Entra 資格情報またはアカウント キーのいずれかを使用してセキュリティ保護することができます。 Microsoft Entra 資格情報でセキュリティ保護された SAS は、ユーザーの代わりに、SAS に署名するために使用される OAuth 2.0 トークンが要求されるため、ユーザー委任 SAS と呼ばれます。

Microsoft では、セキュリティのベスト プラクティスとして、より侵害されやすいアカウント キーを使用するのではなく、可能な限り Microsoft Entra 資格情報を使用することをお勧めします。 アプリケーション設計で Shared Access Signature が必要な場合は、セキュリティを強化するために、Microsoft Entra 資格情報を使用してユーザー委任 SAS を作成してください。 ユーザー委任 SAS の詳細については、「ユーザー委任 SAS を作成する」を参照してください。

注意

有効な SAS を所有するすべてのクライアントは、その SAS で許可されているストレージ アカウントのデータにアクセスできます。 SAS を悪意のある、または意図しない用途から保護することが重要です。 SAS の配布は慎重に行い、侵害された SAS を失効させるための計画を用意しておいてください。

Shared Access Signature の詳細については、「Shared Access Signatures (SAS) を使用して Azure Storage リソースへの制限付きアクセスを許可する」を参照してください。

データにアクセスするための Azure ロールを割り当る

Microsoft Entra セキュリティ プリンシパルが BLOB データにアクセスしようとする場合、そのセキュリティ プリンシパルはリソースへのアクセス許可を保持している必要があります。 セキュリティ プリンシパルが Azure 内のマネージド ID であるか、開発環境でコードを実行している Microsoft Entra ユーザー アカウントであるかにかかわらず、BLOB データへのアクセスを許可する Azure ロールをセキュリティ プリンシパルに割り当てる必要があります。 Azure RBAC によるアクセス許可の割り当てについては、「BLOB データにアクセスするために Azure ロールを割り当てる」を参照してください。

プロジェクトの設定

この記事のコード例を使用するには、次の手順に従ってプロジェクトを設定します。

パッケージをインストールする

次のパッケージをインストールします。

dotnet add package Azure.Identity
dotnet add package Azure.Storage.Blobs

アプリ コードを設定する

次の using ディレクティブを追加します。

using Azure;
using Azure.Identity;
using Azure.Storage.Blobs;
using Azure.Storage.Blobs.Models;
using Azure.Storage.Blobs.Specialized;
using Azure.Storage.Sas;

認証済みのトークン資格情報を取得する

Blob Storage への要求を承認するためにコード上で使用できるトークン資格情報を取得するには、DefaultAzureCredential クラスのインスタンスを作成します。 DefaultAzureCredential クラスを使用して、Blob Storage にアクセスするためのマネージド ID を承認する方法の詳細については、.NET 用 Azure ID クライアント ライブラリに関するページを参照してください。

次のコード スニペットでは、認証されたトークン資格情報を取得し、それを使用して Blob ストレージ用のサービス クライアントを作成する方法が示されています。

// Construct the blob endpoint from the account name.
string endpoint = $"https://{accountName}.blob.core.windows.net";

// Create a blob service client object using DefaultAzureCredential
BlobServiceClient blobServiceClient = new BlobServiceClient(
    new Uri(endpoint),
    new DefaultAzureCredential());

.NET SDK を使用してアプリケーションから Blob Storage へのアクセスを承認する方法の詳細については、Azure サービスで .NET アプリケーションを認証する方法に関するページを参照してください。

ユーザー委任キーを取得する

すべての SAS はキーによって署名されます。 ユーザー委任 SAS を作成するには、まず、SAS に署名するために使用されるユーザー委任キーを要求する必要があります。 ユーザー委任キーは、サービス SAS またはアカウント SAS に署名するために使用されるアカウント キーに似ていますが、Microsoft Entra の資格情報に依存している点が異なります。 クライアントで OAuth 2.0 トークンを使用してユーザー委任キーが要求されると、ユーザーに代わって Blob Storage によってユーザー委任キーが返されます。

ユーザー委任キーを取得したら、そのキーを使用して、キーの有効期間にわたって、任意の数のユーザー委任共有アクセス署名を作成できます。 ユーザー委任キーは、それを取得するために使用された OAuth 2.0 トークンに依存しないため、キーが有効である限り、トークンを更新する必要はありません。 キーが有効である時間の長さを、最大 7 日間まで指定できます。

ユーザー委任キーを要求するには、次のいずれかの方法を使用します。

次のコード例は、ユーザー委任キーを要求する方法を示しています。

public static async Task<UserDelegationKey> RequestUserDelegationKey(
    BlobServiceClient blobServiceClient)
{
    // Get a user delegation key for the Blob service that's valid for 1 day
    UserDelegationKey userDelegationKey =
        await blobServiceClient.GetUserDelegationKeyAsync(
            DateTimeOffset.UtcNow,
            DateTimeOffset.UtcNow.AddDays(1));

    return userDelegationKey;
}

BLOB 用のユーザー委任 SAS を作成する

ユーザー委任キーを取得したら、ユーザー委任 SAS を作成して、BLOB リソースへの制限付きアクセス権を委任できます。 次のコード例は、BLOB 用のユーザー委任 SAS を作成する方法を示しています。

public static async Task<Uri> CreateUserDelegationSASBlob(
    BlobClient blobClient,
    UserDelegationKey userDelegationKey)
{
    // Create a SAS token for the blob resource that's also valid for 1 day
    BlobSasBuilder sasBuilder = new BlobSasBuilder()
    {
        BlobContainerName = blobClient.BlobContainerName,
        BlobName = blobClient.Name,
        Resource = "b",
        StartsOn = DateTimeOffset.UtcNow,
        ExpiresOn = DateTimeOffset.UtcNow.AddDays(1)
    };

    // Specify the necessary permissions
    sasBuilder.SetPermissions(BlobSasPermissions.Read | BlobSasPermissions.Write);

    // Add the SAS token to the blob URI
    BlobUriBuilder uriBuilder = new BlobUriBuilder(blobClient.Uri)
    {
        // Specify the user delegation key
        Sas = sasBuilder.ToSasQueryParameters(
            userDelegationKey,
            blobClient
            .GetParentBlobContainerClient()
            .GetParentBlobServiceClient().AccountName)
    };

    return uriBuilder.ToUri();
}

ユーザー委任 SAS を使用してクライアント オブジェクトを認可する

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

// Create a Uri object with a user delegation SAS appended
BlobClient blobClient = blobServiceClient
    .GetBlobContainerClient("sample-container")
    .GetBlobClient("sample-blob.txt");
Uri blobSASURI = await CreateUserDelegationSASBlob(blobClient, userDelegationKey);

// Create a blob client object with SAS authorization
BlobClient blobClientSAS = new BlobClient(blobSASURI);

リソース

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

REST API の操作

Azure SDK for .NET には Azure REST API に基づいて構築されたライブラリが含まれるため、使い慣れた .NET パラダイムを通じて REST API 操作を利用できます。 ユーザー委任キーを取得するためのクライアント ライブラリ メソッドでは、次の REST API 操作を使用します。

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

関連項目