Skapa en SAS för användardelegering för en blob med .NET

Med en signatur för delad åtkomst (SAS) kan du bevilja begränsad åtkomst till containrar och blobar i ditt lagringskonto. När du skapar en SAS anger du dess begränsningar, inklusive vilka Azure Storage-resurser en klient har åtkomst till, vilka behörigheter de har för dessa resurser och hur länge SAS är giltigt.

Varje SAS signeras med en nyckel. Du kan signera en SAS på något av två sätt:

  • Med en nyckel som skapats med Microsoft Entra-autentiseringsuppgifter. En SAS som är signerad med Microsoft Entra-autentiseringsuppgifter är en SAS för användardelegering . En klient som skapar en SAS för användardelegering måste tilldelas en Azure RBAC-roll som innehåller åtgärden Microsoft.Storage/storageAccounts/blobServices/generateUserDelegationKey . Mer information finns i Skapa en SAS för användardelegering.
  • Med lagringskontonyckeln. Både en tjänst-SAS och ett sas-konto signeras med lagringskontonyckeln. Klienten som skapar en tjänst-SAS måste antingen ha direkt åtkomst till kontonyckeln eller tilldelas behörigheten Microsoft.Storage/storageAccounts/listkeys/action . Mer information finns i Skapa en tjänst-SAS eller Skapa ett konto-SAS.

Kommentar

En SAS för användardelegering ger överlägsen säkerhet till en SAS som är signerad med lagringskontonyckeln. Microsoft rekommenderar att du använder en SAS för användardelegering när det är möjligt. Mer information finns i Bevilja begränsad åtkomst till data med signaturer för delad åtkomst (SAS).

Den här artikeln visar hur du använder Microsoft Entra-autentiseringsuppgifter för att skapa en SAS för användardelegering för en blob med hjälp av Azure Storage-klientbiblioteket för .NET.

Om SAS för användardelegering

En SAS-token för åtkomst till en container eller blob kan skyddas med hjälp av antingen Microsoft Entra-autentiseringsuppgifter eller en kontonyckel. En SAS som skyddas med Microsoft Entra-autentiseringsuppgifter kallas sas för användardelegering eftersom den OAuth 2.0-token som används för att signera SAS begärs för användarens räkning.

Microsoft rekommenderar att du använder Microsoft Entra-autentiseringsuppgifter när det är möjligt som bästa praxis för säkerhet, i stället för att använda kontonyckeln, som är enklare att kompromettera. När din programdesign kräver signaturer för delad åtkomst använder du Microsoft Entra-autentiseringsuppgifter för att skapa en SAS för användardelegering för överlägsen säkerhet. Mer information om SAS för användardelegering finns i Skapa en SAS för användardelegering.

Varning

Alla klienter som har en giltig SAS kan komma åt data i ditt lagringskonto enligt sas-tillstånd. Det är viktigt att skydda en SAS från skadlig eller oavsiktlig användning. Använd diskretion när du distribuerar en SAS och ha en plan för att återkalla en komprometterad SAS.

Mer information om signaturer för delad åtkomst finns i Bevilja begränsad åtkomst till Azure Storage-resurser med hjälp av signaturer för delad åtkomst (SAS).

Tilldela Azure-roller för åtkomst till data

När ett Microsoft Entra-säkerhetsobjekt försöker komma åt blobdata måste det säkerhetsobjektet ha behörighet till resursen. Oavsett om säkerhetsobjektet är en hanterad identitet i Azure eller ett Microsoft Entra-användarkonto som kör kod i utvecklingsmiljön måste säkerhetsobjektet tilldelas en Azure-roll som ger åtkomst till blobdata. Information om hur du tilldelar behörigheter via Azure RBAC finns i Tilldela en Azure-roll för åtkomst till blobdata.

Konfigurera projektet

Följ de här stegen för att konfigurera projektet om du vill arbeta med kodexemplen i den här artikeln.

Installera paket

Installera följande paket:

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

Konfigurera appkoden

Lägg till följande using direktiv:

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

Hämta en autentiserad tokenautentiseringsuppgift

Om du vill hämta en tokenautentiseringsuppgift som koden kan använda för att auktorisera begäranden till Blob Storage skapar du en instans av klassen DefaultAzureCredential . Mer information om hur du använder klassen DefaultAzureCredential för att auktorisera en hanterad identitet för åtkomst till Blob Storage finns i Azure Identity-klientbiblioteket för .NET.

Följande kodfragment visar hur du hämtar autentiseringsuppgifterna för autentiserade token och använder det för att skapa en tjänstklient för Blob Storage:

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

Mer information om hur du auktoriserar åtkomst till Blob Storage från dina program med .NET SDK finns i Autentisera .NET-program med Azure-tjänster.

Hämta användardelegeringsnyckeln

Varje SAS signeras med en nyckel. Om du vill skapa en SAS för användardelegering måste du först begära en användardelegeringsnyckel som sedan används för att signera SAS. Användardelegeringsnyckeln motsvarar den kontonyckel som används för att signera en tjänst-SAS eller ett SAS-konto, förutom att den förlitar sig på dina Microsoft Entra-autentiseringsuppgifter. När en klient begär en användardelegeringsnyckel med en OAuth 2.0-token returnerar Blob Storage användarens delegeringsnyckel för användarens räkning.

När du har användardelegeringsnyckeln kan du använda den nyckeln för att skapa valfritt antal signaturer för delad åtkomst för användare under nyckelns livslängd. Användarens delegeringsnyckel är oberoende av den OAuth 2.0-token som används för att hämta den, så token behöver inte förnyas om nyckeln fortfarande är giltig. Du kan ange hur lång tid nyckeln är giltig, upp till högst sju dagar.

Använd någon av följande metoder för att begära användarens delegeringsnyckel:

Följande kodexempel visar hur du begär användarens delegeringsnyckel:

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

Skapa en SAS för användardelegering för en blob

När du har hämtat användardelegeringsnyckeln kan du skapa en SAS för användardelegering för att delegera begränsad åtkomst till en blobresurs. I följande kodexempel visas hur du skapar en SAS för användardelegering för en blob:

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

Använda en SAS för användardelegering för att auktorisera ett klientobjekt

I följande kodexempel visas hur du använder SAS för användardelegering för att auktorisera ett BlobClient-objekt . Det här klientobjektet kan användas för att utföra åtgärder på blobresursen baserat på de behörigheter som beviljas av SAS.

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

Resurser

Mer information om hur du skapar en SAS för användardelegering med hjälp av Azure Blob Storage-klientbiblioteket för .NET finns i följande resurser.

REST API-åtgärder

Azure SDK för .NET innehåller bibliotek som bygger på Azure REST API, så att du kan interagera med REST API-åtgärder via välbekanta .NET-paradigm. Klientbiblioteksmetoden för att hämta en användardelegeringsnyckel använder följande REST API-åtgärder:

Klientbiblioteksresurser

Se även