.NET ile kapsayıcı veya blob için hizmet SAS'i oluşturma
Paylaşılan erişim imzası (SAS), depolama hesabınızdaki kapsayıcılara ve bloblara sınırlı erişim vermenizi sağlar. SAS oluşturduğunuzda, bir istemcinin erişmesine izin verilen Azure Depolama kaynakları, bu kaynaklar üzerinde sahip olduğu izinler ve SAS'nin ne kadar süre geçerli olduğu gibi sınırlamalarını belirtirsiniz.
Her SAS bir anahtarla imzalanır. SAS'i iki yoldan biriyle imzalayabilirsiniz:
- Microsoft Entra kimlik bilgileri kullanılarak oluşturulan bir anahtarla. Microsoft Entra kimlik bilgileriyle imzalanan SAS, kullanıcı temsilcisi SAS'dir. Kullanıcı temsilcisi SAS oluşturan bir istemciye Microsoft.Storage/storageAccounts/blobServices/generateUserDelegationKey eylemini içeren bir Azure RBAC rolü atanmalıdır. Daha fazla bilgi edinmek için bkz . Kullanıcı temsilcisi SAS'ı oluşturma.
- Depolama hesabı anahtarıyla. Hem hizmet SAS'i hem de hesap SAS'i depolama hesabı anahtarıyla imzalanmıştır. Hizmet SAS'si oluşturan istemcinin hesap anahtarına doğrudan erişimi olmalıdır veya Microsoft.Storage/storageAccounts/listkeys/action izni atanmış olmalıdır. Daha fazla bilgi edinmek için bkz . Hizmet SAS'i oluşturma veya Hesap SAS'ı oluşturma.
Not
Kullanıcı temsilcisi SAS,depolama hesabı anahtarıyla imzalanmış bir SAS için üstün güvenlik sunar. Microsoft mümkün olduğunda kullanıcı temsilcisi SAS'sini kullanmanızı önerir. Daha fazla bilgi için bkz . Paylaşılan erişim imzalarıyla (SAS) verilere sınırlı erişim verme.
Bu makalede, .NET için Azure Blob Depolama istemci kitaplığıyla bir kapsayıcı veya blob için hizmet SAS'i oluşturmak üzere depolama hesabı anahtarının nasıl kullanılacağı gösterilmektedir.
Hizmet SAS'i hakkında
Hizmet SAS'i hesap erişim anahtarıyla imzalanır. Hizmet SAS'sini imzalamak için kullanılan kimlik bilgilerini oluşturmak için StorageSharedKeyCredential sınıfını kullanabilirsiniz.
SAS'nin izinlerini ve süresini tanımlamak için bir depolanmış erişim ilkesi de kullanabilirsiniz. Mevcut bir depolanmış erişim ilkesinin adı sağlanırsa, bu ilke SAS ile ilişkilendirilir. Depolanan erişim ilkeleri hakkında daha fazla bilgi edinmek için bkz . Saklı erişim ilkesi tanımlama. Depolanmış erişim ilkesi sağlanmazsa, bu makaledeki kod örneklerinde SAS için izinleri ve süreyi tanımlama gösterilmektedir.
Hizmet SAS’si oluşturma
Uygulamanızın gereksinimlerine göre kapsayıcı veya blob için hizmet SAS'i oluşturabilirsiniz.
Aşağıdaki kod örneği, bir kapsayıcı kaynağı için hizmet SAS'sinin nasıl oluşturulacağını gösterir. İlk olarak kod, CanGenerateSasUri özelliğini denetleyerek BlobContainerClient nesnesinin paylaşılan anahtar kimlik bilgileriyle yetkilendirildiğini doğrular. Ardından BlobSasBuilder sınıfı aracılığıyla hizmet SAS'sini oluşturur ve istemci ve oluşturucu nesnelerini temel alan bir hizmet SAS URI'sini oluşturmak için GenerateSasUri'yi çağırır.
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;
}
}
İstemci nesnesini yetkilendirmek için hizmet SAS'si kullanma
Bir istemci nesnesini SAS tarafından verilen izinlere göre kapsayıcı veya blob üzerinde işlem gerçekleştirme yetkisi vermek için bir hizmet SAS'si kullanabilirsiniz.
Aşağıdaki kod örnekleri, bir BlobContainerClient nesnesini yetkilendirmek için hizmet SAS'sinin nasıl kullanılacağını gösterir. Bu istemci nesnesi, SAS tarafından verilen izinlere göre kapsayıcı kaynağında işlemler gerçekleştirmek için kullanılabilir.
İlk olarak, hesap erişim anahtarıyla imzalanan bir BlobServiceClient nesnesi oluşturun:
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);
Ardından, önceki örnekte gösterildiği gibi hizmet SAS'sini oluşturun ve BLOBContainerClient nesnesini yetkilendirmek için SAS'yi kullanın:
// 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);
Depolanan erişim ilkesi tanımlama
Depolanan erişim ilkesi, sunucu tarafındaki hizmet düzeyi paylaşılan erişim imzası (SAS) üzerinde ek bir denetim düzeyi sağlar. Depolanan erişim ilkesi oluşturmak, paylaşılan erişim imzalarını gruplandırmaya ve ilkeye bağlı imzalar için ek kısıtlamalar sağlamaya hizmet eder.
Bir imzanın başlangıç saatini, süre sonunu veya izinlerini değiştirmek için bir depolanmış erişim ilkesi kullanabilirsiniz. Ayrıca, bir imza verildikten sonra imzayı iptal etmek için de saklı erişim ilkesi kullanabilirsiniz. Bu bölüm blob kapsayıcılarına odaklanır, ancak depolanmış erişim ilkeleri dosya paylaşımları, kuyruklar ve tablolar için de desteklenir.
Kapsayıcı kaynağında depolanan erişim ilkelerini yönetmek için bir BlobContainerClient nesnesinden aşağıdaki yöntemlerden birini çağırın:
Depolanan erişim ilkesi oluşturma veya değiştirme
Bir kaynakta aynı anda en fazla beş erişim ilkesi ayarlayabilirsiniz. Benzersiz alanı olan Id
her SignedIdentifier
alan bir erişim ilkesine karşılık gelir. Bir kerede beşten fazla erişim ilkesi ayarlamaya çalışmak, hizmetin durum kodunu 400 (Bad Request)
döndürmesine neden olur.
Aşağıdaki kod örneği, bir kapsayıcı kaynağında iki depolanmış erişim ilkesi oluşturmayı gösterir:
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);
}
Var olan bir ilkeyi de değiştirebilirsiniz. Aşağıdaki kod örneğinde, ilkenin son kullanma tarihini güncelleştirmek için tek bir depolanmış erişim ilkesinin nasıl değiştirileceği gösterilmektedir:
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);
}
Depolanan erişim ilkesini iptal etme veya silme
Microsoft, depolanan erişim ilkesini iptal etmek için imzalı tanımlayıcının silinmesini ve yeni bir ilkenin alınmasını önerir. İmzalı tanımlayıcının değiştirilmesi, mevcut imzalarla depolanan erişim ilkesi arasındaki ilişkilendirmeleri bozar. Depolanan erişim ilkesinin silinmesi veya değiştirilmesi, kendisiyle ilişkilendirilmiş tüm paylaşılan erişim imzalarını hemen etkiler.
Aşağıdaki kod örneği, imzalı tanımlayıcının özelliğini değiştirerek bir ilkeyi Id
iptal etme işlemini gösterir. Bu yaklaşım, imzalı tanımlayıcıyı etkili bir şekilde siler ve yeni bir tane oluşturur:
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);
}
Ayrıca, SetAccessPolicyAsync'i boş permissions
bir parametreyle çağırarak kapsayıcı kaynağından tüm erişim ilkelerini kaldırabilirsiniz. Aşağıdaki örnekte, belirtilen bir kapsayıcıdan tüm depolanan erişim ilkelerinin nasıl silineceği gösterilmektedir:
public static async Task DeleteStoredAccessPolicyAsync(BlobContainerClient containerClient)
{
// Remove all stored access policies for the container resource
await containerClient.SetAccessPolicyAsync();
}
Kaynaklar
.NET için Azure Blob Depolama istemci kitaplığını kullanarak hizmet SAS'i oluşturma hakkında daha fazla bilgi edinmek için aşağıdaki kaynaklara bakın.