Een service-SAS maken voor een blob met .NET

Met een Shared Access Signature (SAS) kunt u beperkte toegang verlenen tot containers en blobs in uw opslagaccount. Wanneer u een SAS maakt, geeft u de beperkingen op, waaronder welke Azure Storage-resources een client mag openen, welke machtigingen ze hebben voor deze resources en hoe lang de SAS geldig is.

Elke SAS is ondertekend met een sleutel. U kunt een SAS op twee manieren ondertekenen:

  • Met een sleutel die is gemaakt met behulp van Microsoft Entra-referenties. Een SAS die is ondertekend met Microsoft Entra-referenties is een SAS voor gebruikersdelegatie . Aan een client die een SAS voor gebruikersdelegering maakt, moet een Azure RBAC-rol worden toegewezen die de actie Microsoft.Storage/storageAccounts/blobServices/generateUserDelegationKey bevat. Zie Een SAS voor gebruikersdelegatie maken voor meer informatie.
  • Met de sleutel van het opslagaccount. Zowel een service-SAS als een account-SAS zijn ondertekend met de sleutel van het opslagaccount. De client die een service-SAS maakt, moet directe toegang hebben tot de accountsleutel of de machtiging Microsoft.Storage/storageAccounts/listkeys/action toewijzen. Zie Een service-SAS maken of Een account-SAS maken voor meer informatie.

Notitie

Een SAS voor gebruikersdelegering biedt superieure beveiliging voor een SAS die is ondertekend met de sleutel van het opslagaccount. Microsoft raadt het gebruik van een SAS voor gebruikersdelegering aan, indien mogelijk. Zie Beperkte toegang verlenen tot gegevens met Shared Access Signatures (SAS) voor meer informatie.

In dit artikel wordt beschreven hoe u de sleutel van het opslagaccount gebruikt om een service-SAS te maken voor een blob met de Azure Blob Storage-clientbibliotheek voor .NET.

Over de service-SAS

Een service-SAS is ondertekend met de toegangssleutel voor het account. U kunt de klasse StorageSharedKeyCredential gebruiken om de referentie te maken die wordt gebruikt om de service-SAS te ondertekenen.

U kunt ook een opgeslagen toegangsbeleid gebruiken om de machtigingen en duur van de SAS te definiëren. Als de naam van een bestaand opgeslagen toegangsbeleid wordt opgegeven, is dat beleid gekoppeld aan de SAS. Zie Een opgeslagen toegangsbeleid definiëren voor meer informatie over opgeslagen toegangsbeleid. Als er geen opgeslagen toegangsbeleid is opgegeven, ziet u in de codevoorbeelden in dit artikel hoe u machtigingen en duur voor de SAS definieert.

Een service-SAS voor een blob maken

In het volgende codevoorbeeld ziet u hoe u een service-SAS maakt voor een blobresource. Eerst controleert de code of het BlobClient-object is geautoriseerd met een gedeelde sleutelreferentie door de eigenschap CanGenerateSasUri te controleren. Vervolgens wordt de service-SAS gegenereerd via de BlobSasBuilder-klasse en wordt GenerateSasUri aanroepen om een SAS-URI voor de service te maken op basis van de client- en opbouwobjecten.

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

Een service-SAS gebruiken om een clientobject te autoriseren

In het volgende codevoorbeeld ziet u hoe u de service-SAS gebruikt om een BlobClient-object te autoriseren. Dit clientobject kan worden gebruikt om bewerkingen uit te voeren op de blobresource op basis van de machtigingen die zijn verleend door de SAS.

Maak eerst een BlobServiceClient-object dat is ondertekend met de toegangssleutel van het account:

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

Genereer vervolgens de service-SAS, zoals wordt weergegeven in het eerdere voorbeeld en gebruik de SAS om een BlobClient-object te autoriseren:

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

Opgeslagen toegangsbeleid definiëren

Een opgeslagen toegangsbeleid biedt een extra controleniveau over een SAS (Shared Access Signature) op serviceniveau aan de serverzijde. Het tot stand brengen van een opgeslagen toegangsbeleid dient om handtekeningen voor gedeelde toegang te groeperen en aanvullende beperkingen te bieden voor handtekeningen die zijn gebonden aan het beleid.

U kunt een opgeslagen toegangsbeleid gebruiken om de begintijd, verlooptijd of machtigingen voor een handtekening te wijzigen. U kunt ook een opgeslagen toegangsbeleid gebruiken om een handtekening in te trekken nadat deze is uitgegeven. Deze sectie is gericht op blobcontainers, maar opgeslagen toegangsbeleid wordt ook ondersteund voor bestandsshares, wachtrijen en tabellen.

Als u opgeslagen toegangsbeleid voor een containerresource wilt beheren, roept u een van de volgende methoden aan vanuit een BlobContainerClient-object :

Een opgeslagen toegangsbeleid maken of wijzigen

U kunt maximaal vijf toegangsbeleidsregels voor een resource tegelijk instellen. Elk SignedIdentifier veld, met het unieke Id veld, komt overeen met één toegangsbeleid. Als u meer dan vijf toegangsbeleid tegelijk probeert in te stellen, wordt de statuscode 400 (Bad Request)door de service geretourneerd.

In het volgende codevoorbeeld ziet u hoe u twee opgeslagen toegangsbeleidsregels maakt voor een containerresource:

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

U kunt ook een bestaand beleid wijzigen. In het volgende codevoorbeeld ziet u hoe u één opgeslagen toegangsbeleid wijzigt om de vervaldatum van het beleid bij te werken:

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

Een opgeslagen toegangsbeleid intrekken of verwijderen

Als u een opgeslagen toegangsbeleid wilt intrekken, kunt u het verwijderen, de naam ervan wijzigen door de ondertekende id te wijzigen of de verlooptijd wijzigen in een waarde in het verleden. Als u de ondertekende id wijzigt, worden de koppelingen tussen bestaande handtekeningen en het opgeslagen toegangsbeleid verbroken. Als u de verlooptijd wijzigt in een waarde in het verleden, verlopen de bijbehorende handtekeningen. Als u het opgeslagen toegangsbeleid verwijdert of wijzigt, is dit onmiddellijk van invloed op alle handtekeningen voor gedeelde toegang die eraan zijn gekoppeld.

In het volgende codevoorbeeld ziet u hoe u een beleid kunt intrekken door de Id eigenschap voor de ondertekende id te wijzigen:

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

U kunt ook alle toegangsbeleidsregels uit een containerresource verwijderen door SetAccessPolicyAsync aan te roepen met een lege permissions parameter. In het volgende voorbeeld ziet u hoe u alle opgeslagen toegangsbeleidsregels uit een opgegeven container verwijdert:

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

Resources

Zie de volgende resources voor meer informatie over het maken van een service-SAS met behulp van de Azure Blob Storage-clientbibliotheek voor .NET.

Clientbibliotheekbronnen

Zie ook