Erstellen einer Dienst-SAS für ein Blob 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 Benutzerdelegierungs-SAS. 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 SAS für die Benutzerdelegierung bietet überragende Sicherheit für eine SAS, die mit dem Speicherkontoschlüssel 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 wird beschrieben, wie Sie den Speicherkontoschlüssel zum Erstellen einer Dienst-SAS für ein Blob mit der Azure Blob Storage-Clientbibliothek für .NET verwenden.

Informationen zur Dienst-SAS

Eine Dienst-SAS wird mit dem Kontozugriffsschlüssel signiert. Sie können die StorageSharedKeyCredential-Klasse verwenden, um die Anmeldeinformationen zu erstellen, die zum Signieren der Dienst-SAS verwendet werden.

Sie können auch eine gespeicherte Zugriffsrichtlinie verwenden, um die Berechtigungen und die Dauer der SAS zu definieren. Wenn der Name einer vorhandenen gespeicherten Zugriffsrichtlinie angegeben wird, wird diese Richtlinie der SAS zugewiesen. Weitere Informationen zu gespeicherten Zugriffsrichtlinien finden Sie unter Definieren einer gespeicherten Zugriffsrichtlinie. Die Codebeispiele in diesem Artikel veranschaulichen, wie Berechtigungen und Dauer für die SAS definiert werden, wenn keine gespeicherte Zugriffsrichtlinie bereitgestellt wird.

Erstellen einer Dienst-SAS für ein Blob

Das folgende Codebeispiel veranschaulicht, wie Sie eine Dienst-SAS für eine Blobressource erstellen. Zunächst überprüft der Code, ob das BlobClient-Objekt mit Anmeldeinformationen für gemeinsam genutzte Schlüssel autorisiert wurde, indem die CanGenerateSasUri-Eigenschaft überprüft wird. Anschließend wird die Dienst-SAS über die BlobSasBuilder-Klasse generiert und GenerateSasUri aufgerufen, um einen Dienst-SAS-URI basierend auf den Client- und Builder-Objekten zu erstellen.

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

Verwenden einer Dienst-SAS zum Autorisieren eines Clientobjekts

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

Erstellen Sie zuerst ein BlobServiceClient-Objekt, das mit dem Kontozugriffsschlüssel signiert wird:

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

Generieren Sie dann die Dienst-SAS, wie im vorhergehenden Beispiel gezeigt, und verwenden Sie diese SAS zum Generieren eines BlobClient-Objekts:

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

Definieren einer gespeicherten Zugriffsrichtlinie

Eine gespeicherte Zugriffsrichtlinie bietet eine zusätzliche Steuerungsebene über eine Shared Access Signature (SAS) der Dienstebene auf Serverseite. Durch Festlegen einer gespeicherten Zugriffsrichtlinie können SAS (Shared Access Signatures) gruppiert werden, und es werden zusätzliche Einschränkungen für Signaturen bereitgestellt, die von der Richtlinie abhängig sind.

Sie können mithilfe einer gespeicherten Zugriffsrichtlinie die Startzeit, Ablaufzeit oder Berechtigungen für eine Signatur ändern. Außerdem können Sie mit einer gespeicherten Zugriffsrichtlinie eine Signatur widerrufen, nachdem sie ausgegeben wurde. Dieser Abschnitt konzentriert sich auf Blobcontainer, aber gespeicherte Zugriffsrichtlinien werden auch bei Dateifreigaben, Warteschlangen und Tabellen unterstützt.

Rufen Sie zum Verwalten von gespeicherten Zugriffsrichtlinien für eine Containerressource eine der folgenden Methoden aus einem BlobContainerClient-Objekt auf:

Erstellen oder Ändern einer gespeicherten Zugriffsrichtlinie

Sie können maximal fünf Zugriffsrichtlinien gleichzeitig für eine Ressource festlegen. Jedes SignedIdentifier-Feld mit dem zugehörigen eindeutigen Id-Feld entspricht einer Zugriffsrichtlinie. Der Versuch, mehr als fünf Zugriffsrichtlinien gleichzeitig festzulegen, führt dazu, dass der Dienst den Statuscode 400 (Bad Request) zurückgibt.

Im folgenden Codebeispiel wird gezeigt, wie Sie zwei gespeicherte Zugriffsrichtlinien für eine Containerressource erstellen können:

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

Sie können eine vorhandene Richtlinie auch ändern. Im folgenden Codebeispiel wird gezeigt, wie Sie eine einzelne gespeicherte Zugriffsrichtlinie ändern können, um deren Ablaufdatum zu aktualisieren:

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

Widerrufen oder Löschen einer gespeicherten Zugriffsrichtlinie

Wenn Sie eine gespeicherte Zugriffsrichtlinie widerrufen möchten, können Sie sie löschen, umbenennen, indem Sie den signierten Bezeichner ändern, oder ihre Ablaufzeit in einen Wert in der Vergangenheit ändern. Durch die Änderung des signierten Bezeichners werden die Zuordnungen zwischen vorhandenen Signaturen und der gespeicherten Zugriffsrichtlinie aufgehoben. Das Ändern der Ablaufzeit in einen Wert in der Vergangenheit führt dazu, dass alle zugeordneten Signaturen ablaufen. Das Löschen oder Ändern der gespeicherten Zugriffsrichtlinie wirkt sich sofort auf alle ihr zugeordneten SAS (Shared Access Signatures) aus.

Im folgenden Codebeispiel wird gezeigt, wie Sie eine Richtlinie widerrufen können, indem Sie die Id-Eigenschaft für den signierten Bezeichner ändern:

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

Sie können auch alle Zugriffsrichtlinien aus einer Containerressource entfernen, indem Sie SetAccessPolicyAsync mit einem leeren permissions-Parameter aufrufen. Im folgenden Beispiel wird gezeigt, wie Sie alle gespeicherten Zugriffsrichtlinien aus einem angegebenen Container löschen können:

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

Ressourcen

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

Ressourcen zur Clientbibliothek

Weitere Informationen