Tworzenie sygnatury dostępu współdzielonego usługi dla obiektu blob przy użyciu platformy .NET

Sygnatura dostępu współdzielonego (SAS) umożliwia udzielanie ograniczonego dostępu do kontenerów i obiektów blob na koncie magazynu. Podczas tworzenia sygnatury dostępu współdzielonego określasz jego ograniczenia, w tym zasoby usługi Azure Storage, do których może uzyskiwać dostęp klient, jakie uprawnienia mają w tych zasobach i jak długo sygnatura dostępu współdzielonego jest prawidłowa.

Każda sygnatura dostępu współdzielonego jest podpisana przy użyciu klucza. Sygnaturę dostępu współdzielonego można podpisać na jeden z dwóch sposobów:

  • Za pomocą klucza utworzonego przy użyciu poświadczeń firmy Microsoft Entra. Sygnatura dostępu współdzielonego podpisana przy użyciu poświadczeń usługi Microsoft Entra to sygnatura dostępu współdzielonego delegowania użytkownika. Klient, który tworzy sygnaturę dostępu współdzielonego delegowania użytkownika, musi mieć przypisaną rolę RBAC platformy Azure obejmującą akcję Microsoft.Storage/storageAccounts/blobServices/generateUserDelegationKey . Aby dowiedzieć się więcej, zobacz Tworzenie sygnatury dostępu współdzielonego delegowania użytkownika.
  • Przy użyciu klucza konta magazynu. Sygnatura dostępu współdzielonego usługi i sygnatura dostępu współdzielonego konta są podpisane przy użyciu klucza konta magazynu. Klient tworzący sygnaturę dostępu współdzielonego usługi musi mieć bezpośredni dostęp do klucza konta lub mieć przypisane uprawnienie Microsoft.Storage/storageAccounts/listkeys/action . Aby dowiedzieć się więcej, zobacz Tworzenie sygnatury dostępu współdzielonego usługi lub Tworzenie sygnatury dostępu współdzielonego konta.

Uwaga

Sygnatura dostępu współdzielonego delegowania użytkownika zapewnia doskonałe zabezpieczenia sygnatury dostępu współdzielonego podpisanej przy użyciu klucza konta magazynu. Firma Microsoft zaleca używanie sygnatury dostępu współdzielonego delegowania użytkowników, jeśli jest to możliwe. Aby uzyskać więcej informacji, zobacz Udzielanie ograniczonego dostępu do danych za pomocą sygnatur dostępu współdzielonego (SAS).

W tym artykule pokazano, jak za pomocą klucza konta magazynu utworzyć sygnaturę dostępu współdzielonego usługi dla obiektu blob za pomocą biblioteki klienta usługi Azure Blob Storage dla platformy .NET.

Informacje o sygnaturze dostępu współdzielonego usługi

Sygnatura dostępu współdzielonego usługi jest podpisana przy użyciu klucza dostępu do konta. Możesz użyć klasy StorageSharedKeyCredential , aby utworzyć poświadczenia używane do podpisywania sygnatury dostępu współdzielonego usługi.

Możesz również użyć zapisanych zasad dostępu, aby zdefiniować uprawnienia i czas trwania sygnatury dostępu współdzielonego. Jeśli podano nazwę istniejących przechowywanych zasad dostępu, te zasady są skojarzone z sygnaturą dostępu współdzielonego. Aby dowiedzieć się więcej na temat przechowywanych zasad dostępu, zobacz Definiowanie przechowywanych zasad dostępu. Jeśli nie podano żadnych przechowywanych zasad dostępu, przykłady kodu w tym artykule pokazują, jak zdefiniować uprawnienia i czas trwania sygnatury dostępu współdzielonego.

Tworzenie sygnatury dostępu współdzielonego usługi dla obiektu blob

Poniższy przykładowy kod pokazuje, jak utworzyć sygnaturę dostępu współdzielonego usługi dla zasobu obiektu blob. Najpierw kod sprawdza, czy obiekt BlobClient jest autoryzowany przy użyciu poświadczeń klucza współużytkowanego , sprawdzając właściwość CanGenerateSasUri . Następnie generuje sygnaturę dostępu współdzielonego usługi za pośrednictwem klasy BlobSasBuilder i wywołuje metodę GenerateSasUri , aby utworzyć identyfikator URI sygnatury dostępu współdzielonego usługi na podstawie obiektu klienta i konstruktora.

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

Używanie sygnatury dostępu współdzielonego usługi do autoryzowania obiektu klienta

W poniższym przykładzie kodu pokazano, jak autoryzować obiekt BlobClient przy użyciu sygnatury dostępu współdzielonego usługi. Ten obiekt klienta może służyć do wykonywania operacji na zasobie obiektu blob na podstawie uprawnień przyznanych przez sygnaturę dostępu współdzielonego.

Najpierw utwórz obiekt BlobServiceClient podpisany przy użyciu klucza dostępu do konta:

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

Następnie wygeneruj sygnaturę dostępu współdzielonego usługi, jak pokazano we wcześniejszym przykładzie, i użyj sygnatury dostępu współdzielonego, aby autoryzować obiekt 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);

Definiowanie przechowywanych zasad dostępu

Przechowywane zasady dostępu zapewniają dodatkowy poziom kontroli nad sygnaturą dostępu współdzielonego na poziomie usługi (SAS) po stronie serwera. Ustanowienie przechowywanych zasad dostępu służy do grupowania sygnatur dostępu współdzielonego i zapewnienia dodatkowych ograniczeń dla podpisów powiązanych z zasadami.

Aby zmienić czas rozpoczęcia, czas wygaśnięcia lub uprawnienia podpisu, można użyć zapisanych zasad dostępu. Możesz również użyć zapisanych zasad dostępu, aby odwołać podpis po jego wystawieniu. Ta sekcja koncentruje się na kontenerach obiektów blob, ale przechowywane zasady dostępu są również obsługiwane w przypadku udziałów plików, kolejek i tabel.

Aby zarządzać przechowywanymi zasadami dostępu w zasobie kontenera, wywołaj jedną z następujących metod z obiektu BlobContainerClient :

Tworzenie lub modyfikowanie przechowywanych zasad dostępu

Jednocześnie można ustawić maksymalnie pięć zasad dostępu dla zasobu. Każde SignedIdentifier pole z unikatowym Id polem odpowiada jednemu z zasad dostępu. Próba ustawienia więcej niż pięciu zasad dostępu jednocześnie powoduje zwrócenie przez usługę kodu 400 (Bad Request)stanu .

Poniższy przykład kodu przedstawia sposób tworzenia dwóch przechowywanych zasad dostępu w zasobie kontenera:

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

Możesz również zmodyfikować istniejące zasady. W poniższym przykładzie kodu pokazano, jak zmodyfikować pojedyncze przechowywane zasady dostępu w celu zaktualizowania daty wygaśnięcia zasad:

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

Odwoływanie lub usuwanie przechowywanych zasad dostępu

Aby odwołać przechowywane zasady dostępu, możesz usunąć je, zmienić jego nazwę, zmieniając podpisany identyfikator lub zmieniając czas wygaśnięcia na wartość w przeszłości. Zmiana podpisanego identyfikatora powoduje przerwanie skojarzeń między istniejącymi podpisami a zapisanymi zasadami dostępu. Zmiana czasu wygaśnięcia na wartość w przeszłości powoduje wygaśnięcie wszelkich skojarzonych podpisów. Usunięcie lub zmodyfikowanie przechowywanych zasad dostępu natychmiast wpływa na wszystkie skojarzone z nim sygnatury dostępu współdzielonego.

W poniższym przykładzie kodu pokazano, jak odwołać zasady, zmieniając Id właściwość dla podpisanego identyfikatora:

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

Możesz również usunąć wszystkie zasady dostępu z zasobu kontenera, wywołując polecenie SetAccessPolicyAsync z pustym permissions parametrem. W poniższym przykładzie pokazano, jak usunąć wszystkie przechowywane zasady dostępu z określonego kontenera:

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

Zasoby

Aby dowiedzieć się więcej na temat tworzenia sygnatury dostępu współdzielonego usługi przy użyciu biblioteki klienta usługi Azure Blob Storage dla platformy .NET, zobacz następujące zasoby.

Zasoby biblioteki klienta

Zobacz też