.NET ile 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, istemcinin erişmesine izin verilen Azure Depolama kaynakları, bu kaynaklar üzerinde sahip oldukları 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.Depolama içeren bir Azure RBAC rolü atanmalıdır/storageAccounts/blobServices/generateUserDelegationKey eylemi. 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.Depolama/storageAccounts/listkeys/action izni. Daha fazla bilgi edinmek için bkz . Hizmet SAS'i oluşturma veya Hesap SAS'ı oluşturma.

Dekont

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ığına sahip bir 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 Depolama SharedKeyCredential 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.

Blob için hizmet SAS'i oluşturma

Aşağıdaki kod örneğinde blob kaynağı için hizmet SAS'sinin nasıl oluşturulacağı gösterilmektedir. İlk olarak kod, CanGenerateSasUri özelliğini denetleyerek BlobClient 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> 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;
    }
}

İstemci nesnesini yetkilendirmek için hizmet SAS'si kullanma

Aşağıdaki kod örneği, bir BlobClient nesnesini yetkilendirmek için hizmet SAS'sinin nasıl kullanılacağını gösterir. Bu istemci nesnesi, SAS tarafından verilen izinlere göre blob kaynağında işlem 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);

Daha sonra, önceki örnekte gösterildiği gibi hizmet SAS'sini oluşturun ve BLOBClient nesnesini yetkilendirmek için SAS'yi kullanın:

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

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

Depolanan erişim ilkesini iptal etmek için, imzalı tanımlayıcıyı değiştirerek ilkeyi silebilir, yeniden adlandırabilir veya süre sonu süresini geçmişteki bir değerle değiştirebilirsiniz. İmzalı tanımlayıcının değiştirilmesi, mevcut imzalarla depolanan erişim ilkesi arasındaki ilişkilendirmeleri bozar. Süre sonu süresinin geçmişteki bir değerle değiştirilmesi, ilişkili imzaların süresinin dolmasına neden olur. 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 ilkeyi Id iptal etme işlemini gösterir:

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.

İstemci kitaplığı kaynakları

Ayrıca bkz.