Membuat SAS layanan untuk blob dengan .NET

Tanda tangan akses bersama (SAS) memungkinkan Anda memberikan akses terbatas ke kontainer dan blob di akun penyimpanan Anda. Saat Anda membuat SAS, Anda menentukan batasannya, termasuk sumber daya Azure Storage mana yang diizinkan untuk diakses klien, izin apa yang mereka miliki pada sumber daya tersebut, dan berapa lama SAS valid.

Setiap SAS ditandatangani dengan kunci. Anda dapat menandatangani SAS dengan salah satu dari dua cara:

  • Dengan kunci yang dibuat menggunakan kredensial Microsoft Entra. SAS yang ditandatangani dengan kredensial Microsoft Entra adalah SAS delegasi pengguna. Klien yang membuat SAS delegasi pengguna harus diberi peran Azure RBAC yang menyertakan tindakan Microsoft.Storage /storageAccounts/blobServices/generateUserDelegationKey. Untuk mempelajari selengkapnya, lihat Membuat SAS delegasi pengguna.
  • Dengan kunci akun penyimpanan. SAS layanan dan SAS akun ditandatangani dengan kunci akun penyimpanan. Klien yang membuat SAS layanan harus memiliki akses langsung ke kunci akun atau ditetapkan izin microsoft.Storage/storageAccounts/listkeys/action. Untuk mempelajari selengkapnya, lihat Membuat layanan SAS atau Membuat SAS akun.

Catatan

Delegasi pengguna SAS menawarkan keamanan yang unggul untuk SAS yang ditandatangani dengan kunci akun penyimpanan. Microsoft merekomendasikan menggunakan SAS delegasi pengguna jika memungkinkan. Untuk mengetahui informasi selengkapnya, lihat Memberikan akses terbatas ke data dengan tanda tangan akses bersama (SAS).

Artikel ini memperlihatkan cara menggunakan kunci akun penyimpanan untuk membuat SAS layanan untuk blob dengan pustaka klien Azure Blob Storage untuk .NET.

Tentang layanan SAS

Layanan SAS ditandatangani dengan kunci akses akun. Anda dapat menggunakan kelas StorageSharedKeyCredential untuk membuat kredensial yang digunakan untuk menandatangani layanan SAS.

Anda juga dapat menggunakan kebijakan akses tersimpan untuk menentukan izin dan durasi SAS. Jika disediakan nama kebijakan akses tersimpan, kebijakan tersebut dikaitkan dengan SAS. Untuk mempelajari selengkapnya tentang kebijakan akses tersimpan, lihat Menentukan kebijakan akses tersimpan. Jika tidak ada kebijakan akses tersimpan yang disediakan, contoh kode dalam artikel ini menunjukkan cara menentukan izin dan durasi untuk SAS.

Buat layanan SAS untuk blob

Contoh kode berikut menunjukkan cara membuat SAS layanan untuk sumber daya blob. Pertama, kode memverifikasi bahwa objek BlobClient diotorisasi dengan kredensial kunci bersama dengan memeriksa properti CanGenerateSasUri . Kemudian, ia menghasilkan SAS layanan melalui kelas BlobSasBuilder , dan memanggil GenerateSasUri untuk membuat layanan SAS URI berdasarkan objek klien dan penyusun.

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

Menggunakan SAS layanan untuk mengotorisasi objek klien

Contoh kode berikut menunjukkan cara menggunakan SAS layanan untuk mengotorisasi objek BlobClient . Objek klien ini dapat digunakan untuk melakukan operasi pada sumber daya blob berdasarkan izin yang diberikan oleh SAS.

Pertama, buat objek BlobServiceClient yang ditandatangani dengan kunci akses akun:

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

Kemudian, buat SAS layanan seperti yang ditunjukkan dalam contoh sebelumnya dan gunakan SAS untuk mengotorisasi objek 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);

Tentukan kebijakan akses tersimpan

Kebijakan akses tersimpan memberikan tingkat kontrol tambahan atas tanda tangan akses bersama (SAS) tingkat layanan di sisi server. Membuat kebijakan akses tersimpan berfungsi untuk mengelompokkan tanda tangan akses bersama dan untuk memberikan batasan tambahan untuk tanda tangan yang terikat oleh kebijakan.

Anda dapat menggunakan kebijakan akses tersimpan untuk mengubah waktu mulai, waktu kedaluwarsa, atau izin untuk tanda tangan. Anda juga dapat menggunakan kebijakan akses tersimpan untuk mencabut tanda tangan setelah dikeluarkan. Bagian ini berfokus pada kontainer blob, tetapi kebijakan akses tersimpan juga didukung untuk berbagi file, antrean, dan tabel.

Untuk mengelola kebijakan akses tersimpan pada sumber daya kontainer, panggil salah satu metode berikut dari objek BlobContainerClient :

Membuat atau mengubah kebijakan akses tersimpan

Anda dapat menetapkan maksimal lima kebijakan akses pada sumber daya pada satu waktu. Setiap SignedIdentifier bidang, dengan bidang uniknya Id , sesuai dengan satu kebijakan akses. Mencoba mengatur lebih dari lima kebijakan akses pada satu waktu menyebabkan layanan mengembalikan kode 400 (Bad Request)status .

Contoh kode berikut menunjukkan cara membuat dua kebijakan akses tersimpan pada sumber daya kontainer:

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

Anda juga dapat mengubah kebijakan yang ada. Contoh kode berikut menunjukkan cara mengubah satu kebijakan akses tersimpan untuk memperbarui tanggal kedaluwarsa kebijakan:

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

Mencabut atau menghapus kebijakan akses tersimpan

Untuk mencabut kebijakan akses tersimpan, Anda dapat menghapusnya, mengganti namanya dengan mengubah pengidentifikasi yang ditandatangani, atau mengubah waktu kedaluwarsa menjadi nilai di masa lalu. Mengubah pengidentifikasi yang ditandatangani memecah asosiasi antara tanda tangan yang ada dan kebijakan akses tersimpan. Mengubah waktu kedaluwarsa menjadi nilai di masa lalu menyebabkan tanda tangan terkait menjadi kedaluwarsa. Menghapus atau memodifikasi kebijakan akses tersimpan segera memengaruhi semua tanda tangan akses bersama yang terkait dengannya.

Contoh kode berikut menunjukkan cara mencabut kebijakan dengan mengubah Id properti untuk pengidentifikasi yang ditandatangani:

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

Anda juga dapat menghapus semua kebijakan akses dari sumber daya kontainer dengan memanggil SetAccessPolicyAsync dengan parameter kosong permissions . Contoh berikut menunjukkan cara menghapus semua kebijakan akses tersimpan dari kontainer tertentu:

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

Sumber

Untuk mempelajari selengkapnya tentang membuat SAS layanan menggunakan pustaka klien Azure Blob Storage untuk .NET, lihat sumber daya berikut ini.

Sumber daya pustaka klien

Baca juga