Membuat layanan SAS untuk kontainer atau 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 kontainer atau 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.
Membuat SAS layanan
Anda dapat membuat SAS layanan untuk kontainer atau blob, berdasarkan kebutuhan aplikasi Anda.
Contoh kode berikut menunjukkan cara membuat SAS layanan untuk sumber daya kontainer. Pertama, kode memverifikasi bahwa objek BlobContainerClient 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> CreateServiceSASContainer(
BlobContainerClient containerClient,
string storedPolicyName = null)
{
// Check if BlobContainerClient object has been authorized with Shared Key
if (containerClient.CanGenerateSasUri)
{
// Create a SAS token that's valid for one day
BlobSasBuilder sasBuilder = new BlobSasBuilder()
{
BlobContainerName = containerClient.Name,
Resource = "c"
};
if (storedPolicyName == null)
{
sasBuilder.ExpiresOn = DateTimeOffset.UtcNow.AddDays(1);
sasBuilder.SetPermissions(BlobContainerSasPermissions.Read);
}
else
{
sasBuilder.Identifier = storedPolicyName;
}
Uri sasURI = containerClient.GenerateSasUri(sasBuilder);
return sasURI;
}
else
{
// Client object is not authorized via Shared Key
return null;
}
}
Menggunakan SAS layanan untuk mengotorisasi objek klien
Anda dapat menggunakan SAS layanan untuk mengotorisasi objek klien untuk melakukan operasi pada kontainer atau blob berdasarkan izin yang diberikan oleh SAS.
Contoh kode berikut menunjukkan cara menggunakan SAS layanan untuk mengotorisasi objek BlobContainerClient . Objek klien ini dapat digunakan untuk melakukan operasi pada sumber daya kontainer 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, hasilkan SAS layanan seperti yang ditunjukkan pada contoh sebelumnya dan gunakan SAS untuk mengotorisasi objek BlobContainerClient :
// Create a Uri object with a service SAS appended
BlobContainerClient containerClient = blobServiceClient
.GetBlobContainerClient("sample-container");
Uri containerSASURI = await CreateServiceSASContainer(containerClient);
// Create a container client object representing 'sample-container' with SAS authorization
BlobContainerClient containerClientSAS = new BlobContainerClient(containerSASURI);
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, Microsoft merekomendasikan untuk menghapus pengidentifikasi yang ditandatangani dan membuat yang baru. Mengubah pengidentifikasi yang ditandatangani memecah asosiasi antara tanda tangan yang ada dan kebijakan akses tersimpan. 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. Pendekatan ini secara efektif menghapus pengidentifikasi yang ditandatangani dan membuat yang baru:
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.