إنشاء SAS خدمة لحاوية باستخدام .NET

يتيح لك توقيع الوصول المشترك (SAS) منح وصول محدود إلى الحاويات والكائنات الثنائية كبيرة الحجم في حساب التخزين الخاص بك. عند إنشاء توقيع الوصول المشترك، فإنك تحدد قيوده بما في ذلك موارد تخزين Azure التي يُسمح للعميل بالوصول إليها، وما هي الأذونات التي يمتلكها على تلك الموارد، ومدة صلاحية توقيع الوصول المشترك.

يتم عملية توقيع كل SAS بمفتاح. يمكنك توقيع SAS بإحدى طريقتين:

  • باستخدام مفتاح تم إنشاؤه باستخدام بيانات اعتماد Microsoft Entra. SAS الذي تم توقيعه باستخدام بيانات اعتماد Microsoft Entra هو SAS لتفويض المستخدم. يجب أن يتم تعيين دور Azure RBAC للعميل الذي يقوم بإنشاء تحويل مستخدم SAS والذي يتضمن الإجراء Microsoft.Storage/storageAccounts/blobServices/generateUserDelegationKey. لمعرفة المزيد، راجع إنشاء توقيعات الوصول المشترك لتفويض المستخدم.
  • باستخدام مفتاح حساب التخزين. يتم توقيع كل من توقيع الوصول المشترك للخدمة و توقيع الوصول المشترك للحساب باستخدام مفتاح حساب التخزين. يجب أن يكون للعميل الذي ينشئ خدمة SAS حق وصول مباشر إلى مفتاح الحساب أو أن يتم تعيين إذن Microsoft.Storage/storageAccounts/listkeys/action. لمعرفة المزيد، راجع إنشاء SAS خدمة أو إنشاء حساب SAS.

إشعار

يوفر توقيع الوصول المشترك لتفويض المستخدم أماناً فائقاً لتوقيع الوصول المشترك الموقع باستخدام مفتاح حساب التخزين. توصي Microsoft باستخدام توقيع الوصول المشترك لتفويض المستخدم عندما يكون ذلك ممكناً. لمعرفة المزيد من المعلومات حول مفاتيح SAS، راجع منح وصول محدود إلى البيانات باستخدام توقيعات الوصول المشتركة (SAS).

توضح هذه المقالة كيفية استخدام مفتاح حساب التخزين لإنشاء SAS خدمة لحاوية باستخدام مكتبة عميل Azure Blob Storage ل .NET.

حول SAS للخدمة

يتم توقيع SAS لخدمة باستخدام مفتاح اختصار الحساب. يمكنك استخدام فئة StorageSharedKeyCredential لإنشاء بيانات الاعتماد المستخدمة لتوقيع SAS للخدمة.

يمكنك أيضا استخدام نهج وصول مخزن لتحديد أذونات ومدة SAS. إذا تم توفير اسم لنهج وصول مخزن موجود، فسيرتبط هذا النهج بتوقيع الوصول المشترك. لمعرفة المزيد حول نهج الوصول المخزنة، راجع تعريف نهج الوصول المخزن. إذا لم يتم توفير نهج وصول مخزن، فإن أمثلة التعليمات البرمجية في هذه المقالة توضح كيفية تعريف الأذونات والمدة ل SAS.

إنشاء SAS خدمة لحاوية

يوضح مثال التعليمات البرمجية التالي كيفية إنشاء SAS خدمة لمورد حاوية. أولا، تتحقق التعليمات البرمجية من أن كائن BlobContainerClient مخول ببيانات اعتماد مفتاح مشترك عن طريق التحقق من الخاصية CanGenerateSasUri . ثم يقوم بإنشاء SAS للخدمة عبر فئة BlobSasBuilder ، ويستدعي GenerateSasUri لإنشاء خدمة SAS URI استنادا إلى كائنات العميل والمنشئ.

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

استخدام SAS للخدمة لتخويل كائن عميل

توضح أمثلة التعليمات البرمجية التالية كيفية استخدام SAS للخدمة لتخويل كائن BlobContainerClient . يمكن استخدام كائن العميل هذا لتنفيذ العمليات على مورد الحاوية استنادا إلى الأذونات الممنوحة من قبل SAS.

أولا، إنشاء كائن BlobServiceClient موقع باستخدام مفتاح الوصول إلى الحساب:

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

ثم قم بإنشاء SAS للخدمة كما هو موضح في المثال السابق واستخدم SAS لتخويل كائن 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);

تعريف نهج وصول مخزّن

يوفر نهج الوصول المخزن مستوى إضافيا من التحكم في توقيع الوصول المشترك على مستوى الخدمة (SAS) على جانب الخادم. يؤدي إنشاء نهج وصول مخزن إلى تجميع توقيعات الوصول المشتركة وتوفير قيود إضافية للتواقيع المرتبطة بالنهج.

يمكنك استخدام نهج وصول مخزن لتغيير وقت البدء أو وقت انتهاء الصلاحية أو أذونات التوقيع. يمكنك أيضا استخدام نهج وصول مخزن لإبطال توقيع بعد إصداره. يركز هذا القسم على حاويات الكائنات الثنائية كبيرة الحجم، ولكن يتم دعم نهج الوصول المخزنة أيضا لمشاركات الملفات وقوائم الانتظار والجداول.

لإدارة نهج الوصول المخزنة على مورد حاوية، قم باستدعاء إحدى الطرق التالية من كائن BlobContainerClient :

إنشاء نهج وصول مخزن أو تعديله

يمكنك تعيين خمسة نهج وصول كحد أقصى على مورد في كل مرة. يتوافق كل SignedIdentifier حقل، مع حقله الفريد Id ، مع نهج وصول واحد. تؤدي محاولة تعيين أكثر من خمسة نهج وصول في وقت واحد إلى إرجاع الخدمة لرمز 400 (Bad Request)الحالة .

يوضح مثال التعليمات البرمجية التالي كيفية إنشاء نهجي وصول مخزنين على مورد حاوية:

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

يمكنك أيضا تعديل نهج موجود. يوضح مثال التعليمات البرمجية التالي كيفية تعديل نهج وصول مخزن واحد لتحديث تاريخ انتهاء صلاحية النهج:

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

إبطال نهج وصول مخزن أو حذفه

لإبطال نهج وصول مخزن، توصي Microsoft بحذف المعرف الموقع وإنشاء معرف جديد. يؤدي تغيير المعرف الموقع إلى فصل الاقترانات بين أي توقيعات موجودة وسياسة الوصول المخزنة. يؤثر حذف نهج الوصول المخزن أو تعديله على الفور على جميع توقيعات الوصول المشتركة المقترنة به.

يوضح مثال التعليمات البرمجية التالي كيفية إبطال نهج عن طريق تغيير الخاصية Id للمعرف الموقع. يحذف هذا الأسلوب المعرف الموقع بشكل فعال ويجعل معرفا جديدا:

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

يمكنك أيضا إزالة كافة نهج الوصول من مورد حاوية عن طريق استدعاء SetAccessPolicyAsync مع معلمة فارغة permissions . يوضح المثال التالي كيفية حذف كافة نهج الوصول المخزنة من حاوية محددة:

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

الموارد

لمعرفة المزيد حول إنشاء SAS للخدمة باستخدام مكتبة عميل Azure Blob Storage ل .NET، راجع الموارد التالية.

موارد مكتبة العميل

(راجع أيضًا )