Erstellen einer Benutzerdelegierungs-SAS für Azure Blob, Azure Files und Azure Warteschlange mit .NET

Eine Shared Access Signature (SAS) ermöglicht Ihnen, eingeschränkten Zugriff auf Container und Blobs in Ihrem Speicherkonto zu gewähren. Wenn Sie eine SAS erstellen, geben Sie ihre Einschränkungen an, einschließlich der Azure Storage-Ressourcen, auf die Clients zugreifen dürfen, welche Berechtigungen sie für diese Ressourcen haben und wie lange die SAS gültig ist.

Jede SAS wird mit einem Schlüssel signiert. Zum Signieren einer SAS stehen zwei Möglichkeiten zur Verfügung:

  • Mit einem Schlüssel, der mit Microsoft Entra-Anmeldeinformationen erstellt wurde. Eine SAS, die mit Microsoft Entra-Anmeldeinformationen signiert wurde, ist eine SAS für die Benutzerdelegierung. Einem Client, der eine SAS für die Benutzerdelegierung erstellt, muss eine Azure RBAC-Rolle zugewiesen werden, in der die Aktion Microsoft.Storage/storageAccounts/blobServices/generateUserDelegationKey enthalten ist. Weitere Informationen finden Sie unter Erstellen einer SAS für die Benutzerdelegierung.
  • Mit dem Speicherkontoschlüssel. Sowohl eine Dienst-SAS als auch eine Konto-SAS wird mit dem Speicherkontoschlüssel signiert. Der Client, der eine Dienst-SAS erstellt, muss entweder direkten Zugriff auf den Kontoschlüssel haben, oder ihm muss die Berechtigung Microsoft.Storage /storageAccounts/listkeys/action zugewiesen werden. Weitere Informationen finden Sie unter Erstellen einer Dienst-SAS oder Erstellen einer Konto-SAS.

Hinweis

Eine Benutzerdelegierungs-SAS bietet mehr Sicherheit als eine SAS, die mit dem Schlüssel des Speicherkontos signiert wird. Microsoft empfiehlt, nach Möglichkeit eine SAS für die Benutzerdelegierung zu verwenden. Weitere Informationen finden Sie unter Gewähren von eingeschränktem Zugriff auf Daten mithilfe von SAS (Shared Access Signature).

In diesem Artikel erfahren Sie, wie Sie mithilfe von Microsoft Entra-Anmeldeinformationen eine SAS mit Benutzerdelegierung für einen Container oder Blob unter Verwendung der Azure Storage-Clientbibliothek für .NET erstellen.

Informationen zur Benutzerdelegierungs-SAS

Ein SAS-Token für den Zugriff auf einen Container oder ein Blob kann entweder mit Azure AD-Anmeldeinformationen oder einem Kontoschlüssel geschützt werden. Eine mit Microsoft Entra-Anmeldeinformationen gesicherte SAS wird als SAS für die Benutzerdelegierung bezeichnet, da das OAuth 2.0-Token, das zum Signieren der SAS verwendet wird, im Namen des Benutzers angefordert wird.

Microsoft empfiehlt als bewährte Methode, nach Möglichkeit Azure AD-Anmeldeinformationen anstelle des Kontoschlüssels zu verwenden, der leichter kompromittiert werden kann. Wenn Ihr Anwendungsdesign Shared Access Signatures erfordert, verwenden Sie Microsoft Entra-Anmeldeinformationen, um eine Benutzerdelegierungs-SAS für erhöhte Sicherheit zu erstellen. Weitere Informationen zur SAS für die Benutzerdelegierung finden Sie unter Erstellen einer SAS für die Benutzerdelegierung.

Achtung

Jeder Client, der über eine gültige SAS verfügt, kann auf Daten in Ihrem Speicherkonto zugreifen, sofern von dieser SAS zugelassen. Es ist wichtig, eine SAS vor böswilliger oder unbeabsichtigter Verwendung zu schützen. Verteilen Sie eine SAS mit Diskretion, und halten Sie einen Plan für den Widerruf einer kompromittierten SAS bereit.

Weitere Informationen zu SAS (Shared Access Signatures) finden Sie unter Gewähren von eingeschränktem Zugriff auf Azure Storage-Ressourcen mithilfe von SAS (Shared Access Signature).

Zuweisen von Azure-Rollen für den Datenzugriff

Wenn ein Microsoft Entra-Sicherheitsprinzipal versucht, auf Daten zuzugreifen, muss dieser Sicherheitsprinzipal über Berechtigungen für die Ressource verfügen. Dem Sicherheitsprinzipal muss eine Azure-Rolle zugewiesen werden, die den Zugriff auf Daten ermöglicht. Dabei spielt es keine Rolle, ob es sich bei dem Sicherheitsprinzipal um eine verwaltete Identität in Azure oder um ein Microsoft Entra-Benutzerkonto handelt, mit dem Code in der Entwicklungsumgebung ausgeführt wird. Weitere Informationen zum Zuweisen von Berechtigungen über die rollenbasierte Zugriffssteuerung in Azure finden Sie unter Zuweisen einer Azure-Rolle für den Zugriff auf Blobdaten.

Einrichten des Projekts

Um die Codebeispiele in diesem Artikel zu verwenden, führen Sie die folgenden Schritte zum Einrichten Ihres Projekts aus.

Installieren von Paketen

Installieren Sie die folgenden Pakete:

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

Einrichten des App-Codes

Fügen Sie die folgenden using Direktiven für Blobs hinzu:

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

Fügen Sie die folgenden using Direktiven für Dateien hinzu:

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

Fügen Sie die folgenden using Direktiven für Warteschlangen hinzu:

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

Authentifizierte Token-Anmeldeinformationen abrufen

Erstellen Sie eine Instanz der Klasse DefaultAzureCredential, um Tokenanmeldeinformationen abzurufen, die in Ihrem Code zum Autorisieren von Anforderungen für Blob Storage verwendet werden können. Weitere Informationen zur Verwendung der Klasse „DefaultAzureCredential“ zum Autorisieren einer verwalteten Identität für den Zugriff auf Blob Storage finden Sie unter Azure Identity-Clientbibliothek für .NET.

Im folgenden Codeausschnitt sehen Sie, wie Sie die authentifizierten Tokenanmeldeinformationen abrufen und damit einen Dienstclient für Blob Storage erstellen:

// 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());

Weitere Informationen zum Autorisieren des Zugriffs von Ihren Anwendungen auf Blob Storage mit dem .NET SDK finden Sie unter Authentifizieren von .NET-Anwendungen mit Azure-Diensten.

Der folgende Codeausschnitt zeigt, wie die authentifizierten Tokenanmeldeinformationen abgerufen und zum Erstellen eines Dienstclients für die Dateispeicherung verwendet werden:

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

// Create a file service client object using DefaultAzureCredential
FilesServiceClient filesServiceClient = new filesServiceClient(
    new Uri(endpoint),
    new DefaultAzureCredential());

Im folgenden Codeausschnitt sehen Sie, wie Sie die authentifizierten Tokenanmeldeinformationen abrufen und damit einen Dienstclient für Queue Storage erstellen:

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

// Create a queue service client object using DefaultAzureCredential
QueueServiceClient queueServiceClient = new QueueServiceClient(
    new Uri(endpoint),
    new DefaultAzureCredential());

Abrufen des Benutzerdelegierungsschlüssels

Jede SAS wird mit einem Schlüssel signiert. Zum Erstellen einer SAS für die Benutzerdelegierung müssen Sie zuerst einen Benutzerdelegierungsschlüssel anfordern, der dann zum Signieren der SAS verwendet wird. Der Benutzerdelegierungsschlüssel ist analog zum Kontoschlüssel, mit dem eine Dienst-SAS oder eine Konto-SAS signiert wird, mit der Ausnahme, dass er auf Ihren Azure AD-Anmeldeinformationen basiert. Wenn ein Client einen Benutzerdelegierungsschlüssel mithilfe eines OAuth 2.0-Tokens anfordert, gibt Blob Storage den Benutzerdelegierungsschlüssel im Namen des Benutzers zurück.

Nachdem Sie den Benutzerdelegierungsschlüssel abgerufen haben, können Sie mit diesem Schlüssel während seiner Lebensdauer eine beliebige Anzahl von Shared Access Signatures (SAS) für die Benutzerdelegierung erstellen. Der Benutzerdelegierungsschlüssel ist unabhängig vom OAuth 2.0-Token, das zum Abrufen des Schlüssels verwendet wird. Daher muss das Token nicht erneuert werden, solange der Schlüssel gültig ist. Sie können angeben, wie lange der Schlüssel gültig bleibt (maximal bis zu sieben Tage).

Fordern Sie den Benutzerdelegierungsschlüssel mit einer der folgenden Methoden an:

Das folgende Codebeispiel zeigt, wie die Benutzerdelegierung für Blobs angefordert wird:

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;
}

Das folgende Codebeispiel zeigt, wie die Benutzerdelegierung für Dateien angefordert wird:

public static async Task<UserDelegationKey> RequestUserDelegationKey(
    FileServiceClient fileServiceClient)
{
    // Get a user delegation key for the Azure Files Service that's valid for 1 day
    UserDelegationKey userDelegationKey =
        await fileServiceClient.GetUserDelegationKeyAsync(
            DateTimeOffset.UtcNow,
            DateTimeOffset.UtcNow.AddDays(1));

    return userDelegationKey;
}

Das folgende Codebeispiel zeigt, wie die Benutzerdelegierung für Warteschlangen anzufordern ist:

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

    return userDelegationKey;
}

Benutzerdelegierungs-SAS erstellen

Sie können je nach den Anforderungen Ihrer App eine Benutzerdelegierungs-SAS für einen Blobcontainer, einen Blob, eine Dateifreigabe, eine Datei oder eine Warteschlange erstellen.

Sobald Sie den Benutzerdelegierungsschlüssel abgerufen haben, können Sie eine SAS für die Benutzerdelegierung erstellen, um den eingeschränkten Zugriff auf einen Container zu delegieren. Im folgenden Codebeispiel wird gezeigt, wie Sie eine SAS für die Benutzerdelegierung für einen Container erstellen:

public static async Task<Uri> CreateUserDelegationSASContainer(
    BlobContainerClient containerClient,
    UserDelegationKey userDelegationKey)
{
    // Create a SAS token for the container resource that's also valid for 1 day
    BlobSasBuilder sasBuilder = new BlobSasBuilder()
    {
        BlobContainerName = containerClient.Name,
        Resource = "c",
        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(containerClient.Uri)
    {
        // Specify the user delegation key
        Sas = sasBuilder.ToSasQueryParameters(
            userDelegationKey,
            containerClient.GetParentBlobServiceClient().AccountName)
    };

    return uriBuilder.ToUri();
}

Verwenden einer Benutzerdelegierungs-SAS, um ein Clientobjekt zu autorisieren

Sie können eine Benutzerdelegierungs-SAS verwenden, um ein Clientobjekt zur Ausführung von Vorgängen für einen Blobcontainer, einen Blob, eine Dateifreigabe, eine Datei oder eine Warteschlange auf Grundlage der durch die SAS gewährten Berechtigungen zu autorisieren.

Das folgende Codebeispiel veranschaulicht, wie Sie die SAS für die Benutzerdelegierung verwenden, um ein BlobContainerClient-Objekt zu autorisieren. Dieses Clientobjekt kann verwendet werden, um Vorgänge für die Containerressource basierend auf den von der SAS erteilten Berechtigungen auszuführen.

// Create a Uri object with a user delegation SAS appended
BlobContainerClient containerClient = blobServiceClient
    .GetBlobContainerClient("sample-container");
Uri containerSASURI = await CreateUserDelegationSASContainer(containerClient, userDelegationKey);

// Create a container client object with SAS authorization
BlobContainerClient containerClientSAS = new BlobContainerClient(containerSASURI);

Ressourcen

Weitere Informationen zum Erstellen einer SAS für die Benutzerdelegierung mithilfe der Azure Blob Storage-Clientbibliothek für .NET finden Sie in den folgenden Ressourcen.

Codebeispiele

REST-API-Vorgänge

Das Azure SDK für .NET enthält Bibliotheken, die auf der zugrunde liegenden Azure-REST-API basieren, und ermöglicht Ihnen dadurch die Interaktion mit REST-API-Vorgängen über vertraute .NET-Paradigmen. Die Methode zum Abrufen eines Benutzerdelegierungsschlüssels der Clientbibliothek verwendet den folgenden REST-API-Vorgang:

Ressourcen zur Clientbibliothek

Siehe auch

  • Dieser Artikel ist Teil des Blob Storage-Entwicklerleitfadens für .NET. Weitere Informationen finden Sie in der vollständigen Liste der Entwicklerleitfadenartikel unter Erstellen Ihrer .NET-App.