إنشاء SAS تفويض مستخدم لحاوية أو دليل أو كائن ثنائي كبير الحجم باستخدام .NET

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

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

  • باستخدام مفتاح تم إنشاؤه باستخدام بيانات اعتماد Microsoft Azure Active Directory (Azure AD). SAS الذي تم توقيعه باستخدام بيانات اعتمادMicrosoft Azure Active Directory هو SAS تفويض المستخدم .
  • باستخدام المفتاح الخاص بحساب التخزين. يتم توقيع كل من SAS الخدمةوحساب SAS باستخدام المفتاح الخاص بحساب التخزين.

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

توضح هذه المقالة كيفية استخدام بيانات اعتماد Microsoft Azure Active Directory(Azure AD) لإنشاء SAS تفويض مستخدم لحاوية أو دليل أو كائن ثنائي كبير الحجم مع مكتبة عميل تخزين Azure ل .NET الإصدار 12.

حول التفويض الخاص بالمستخدم SAS

قد يتم تأمين رمز SAS المميز للوصول إلى حاوية أو كائن ثنائي كبير الحجم باستخدام بيانات اعتماد Microsoft Azure Active Directory أو مفتاح حساب. يطلق على SAS المؤمن ببيانات اعتمادMicrosoft Azure Active Directory اسم SAS لتفويض المستخدم، لأن الرمز المميز OAuth 2.0 المستخدم للتوقيع على SAS مطلوب نيابة عن المستخدم.

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

تنبيه

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

للحصول على مزيد من المعلومات عن توقيعات الوصول المشارك، راجع منح الوصول المحدود إلى موارد Azure Storage باستخدام توقيعات الوصول المشاركة (SAS).

ضبط أدوار Azure للوصول إلى البيانات

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

لمعرفة المزيد حول كيفية الحصول على رمز مميز باستخدام مكتبة هوية عميل Azure من موقع تخزين Azure راجع استخدام مكتبة هوية Azure للحصول على رمز وصول مميز للتخويل.

الحصول على بيانات اعتماد الرمز المميز المصادق عليها

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

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

// Construct the blob endpoint from the account name.
string blobEndpoint = string.Format("https://{0}.blob.core.windows.net", accountName);

// Create a new Blob service client with Azure AD credentials.
BlobServiceClient blobClient = new BlobServiceClient(new Uri(blobEndpoint),
                                                     new DefaultAzureCredential());

الحصول على مفتاح التفويض الخاص بالمستخدم

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

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

استخدم إحدى الطرق التالية لطلب مفتاح التفويض الخاص بالمستخدم:

يحصل قصاصة التعليمات البرمجية التالي على مفتاح تفويض المستخدم ويكتب خصائصه:

// Get a user delegation key for the Blob service that's valid for seven days.
// You can use the key to generate any number of shared access signatures over the lifetime of the key.
UserDelegationKey key = await blobClient.GetUserDelegationKeyAsync(DateTimeOffset.UtcNow,
                                                                   DateTimeOffset.UtcNow.AddDays(7));

// Read the key's properties.
Console.WriteLine("User delegation key properties:");
Console.WriteLine("Key signed start: {0}", key.SignedStartsOn);
Console.WriteLine("Key signed expiry: {0}", key.SignedExpiresOn);
Console.WriteLine("Key signed object ID: {0}", key.SignedObjectId);
Console.WriteLine("Key signed tenant ID: {0}", key.SignedTenantId);
Console.WriteLine("Key signed service: {0}", key.SignedService);
Console.WriteLine("Key signed version: {0}", key.SignedVersion);

الحصول على تفويض مستخدم SAS للحصول على كائن ثنائي كبير الحجم

يوضح مثال التعليمات البرمجية التالي التعليمة البرمجية الكاملة لمصادقة مبدأ الأمان وإنشاء SAS تفويض المستخدم لكائن ثنائي كبير الحجم:

async static Task<Uri> GetUserDelegationSasBlob(BlobClient blobClient)
{
    BlobServiceClient blobServiceClient =
        blobClient.GetParentBlobContainerClient().GetParentBlobServiceClient();

    // Get a user delegation key for the Blob service that's valid for 7 days.
    // You can use the key to generate any number of shared access signatures 
    // over the lifetime of the key.
    Azure.Storage.Blobs.Models.UserDelegationKey userDelegationKey =
        await blobServiceClient.GetUserDelegationKeyAsync(DateTimeOffset.UtcNow,
                                                          DateTimeOffset.UtcNow.AddDays(7));

    // Create a SAS token that's also valid for 7 days.
    BlobSasBuilder sasBuilder = new BlobSasBuilder()
    {
        BlobContainerName = blobClient.BlobContainerName,
        BlobName = blobClient.Name,
        Resource = "b",
        StartsOn = DateTimeOffset.UtcNow,
        ExpiresOn = DateTimeOffset.UtcNow.AddDays(7)
    };

    // Specify read and write permissions for the SAS.
    sasBuilder.SetPermissions(BlobSasPermissions.Read |
                              BlobSasPermissions.Write);

    // Add the SAS token to the blob URI.
    BlobUriBuilder blobUriBuilder = new BlobUriBuilder(blobClient.Uri)
    {
        // Specify the user delegation key.
        Sas = sasBuilder.ToSasQueryParameters(userDelegationKey, 
                                              blobServiceClient.AccountName)
    };

    Console.WriteLine("Blob user delegation SAS URI: {0}", blobUriBuilder);
    Console.WriteLine();
    return blobUriBuilder.ToUri();
}

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

static async Task ReadBlobWithSasAsync(Uri sasUri)
{
    // Try performing a read operation using the blob SAS provided.

    // Create a blob client object for blob operations.
    BlobClient blobClient = new BlobClient(sasUri, null);

    // Download and read the contents of the blob.
    try
    {
        Console.WriteLine("Blob contents:");

        // Download blob contents to a stream and read the stream.
        BlobDownloadInfo blobDownloadInfo = await blobClient.DownloadAsync();
        using (StreamReader reader = new StreamReader(blobDownloadInfo.Content, true))
        {
            string line;
            while ((line = reader.ReadLine()) != null)
            {
                Console.WriteLine(line);
            }
        }

        Console.WriteLine();
        Console.WriteLine("Read operation succeeded for SAS {0}", sasUri);
        Console.WriteLine();
    }
    catch (RequestFailedException e)
    {
        // Check for a 403 (Forbidden) error. If the SAS is invalid, 
        // Azure Storage returns this error.
        if (e.Status == 403)
        {
            Console.WriteLine("Read operation failed for SAS {0}", sasUri);
            Console.WriteLine("Additional error information: " + e.Message);
            Console.WriteLine();
        }
        else
        {
            Console.WriteLine(e.Message);
            Console.ReadLine();
            throw;
        }
    }
}

الحصول على التفويض الخاص بالمستخدم SAS لحاوية

يعرض مثال التعليمة البرمجية التالي كيفية إنشاء SAS تفويض مستخدم لحاوية:

async static Task<Uri> GetUserDelegationSasContainer(BlobContainerClient blobContainerClient)
{
    BlobServiceClient blobServiceClient = blobContainerClient.GetParentBlobServiceClient();

    // Get a user delegation key for the Blob service that's valid for seven days.
    // You can use the key to generate any number of shared access signatures 
    // over the lifetime of the key.
    Azure.Storage.Blobs.Models.UserDelegationKey userDelegationKey =
        await blobServiceClient.GetUserDelegationKeyAsync(DateTimeOffset.UtcNow,
                                                          DateTimeOffset.UtcNow.AddDays(7));

    // Create a SAS token that's also valid for seven days.
    BlobSasBuilder sasBuilder = new BlobSasBuilder()
    {
        BlobContainerName = blobContainerClient.Name,
        Resource = "c",
        StartsOn = DateTimeOffset.UtcNow,
        ExpiresOn = DateTimeOffset.UtcNow.AddDays(7)
    };

    // Specify racwl permissions for the SAS.
    sasBuilder.SetPermissions(
        BlobContainerSasPermissions.Read |
        BlobContainerSasPermissions.Add |
        BlobContainerSasPermissions.Create |
        BlobContainerSasPermissions.Write |
        BlobContainerSasPermissions.List
        );

    // Add the SAS token to the container URI.
    BlobUriBuilder blobUriBuilder = new BlobUriBuilder(blobContainerClient.Uri)
    {
        // Specify the user delegation key.
        Sas = sasBuilder.ToSasQueryParameters(userDelegationKey,
                                              blobServiceClient.AccountName)
    };

    Console.WriteLine("Container user delegation SAS URI: {0}", blobUriBuilder);
    Console.WriteLine();
    return blobUriBuilder.ToUri();
}

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

private static async Task ListBlobsWithSasAsync(Uri sasUri)
{
    // Try performing a listing operation using the container SAS provided.

    // Create a container client object for blob operations.
    BlobContainerClient blobContainerClient = new BlobContainerClient(sasUri, null);

    // List blobs in the container.
    try
    {
        // Call the listing operation and return pages of the specified size.
        var resultSegment = blobContainerClient.GetBlobsAsync().AsPages();

        // Enumerate the blobs returned for each page.
        await foreach (Azure.Page<BlobItem> blobPage in resultSegment)
        {
            foreach (BlobItem blobItem in blobPage.Values)
            {
                Console.WriteLine("Blob name: {0}", blobItem.Name);
            }
            Console.WriteLine();
        }

        Console.WriteLine();
        Console.WriteLine("Blob listing operation succeeded for SAS {0}", sasUri);
    }
    catch (RequestFailedException e)
    {
        // Check for a 403 (Forbidden) error. If the SAS is invalid, 
        // Azure Storage returns this error.
        if (e.Status == 403)
        {
            Console.WriteLine("Blob listing operation failed for SAS {0}", sasUri);
            Console.WriteLine("Additional error information: " + e.Message);
            Console.WriteLine();
        }
        else
        {
            Console.WriteLine(e.Message);
            Console.ReadLine();
            throw;
        }
    }
}

الحصول على تفويض المستخدم SAS لدليل

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

async static Task<Uri> GetUserDelegationSasDirectory(DataLakeDirectoryClient directoryClient)
{
    try
    {
        // Get service endpoint from the directory URI.
        DataLakeUriBuilder dataLakeServiceUri = new DataLakeUriBuilder(directoryClient.Uri)
        {
            FileSystemName = null,
            DirectoryOrFilePath = null
        };

        // Get service client.
        DataLakeServiceClient dataLakeServiceClient =
            new DataLakeServiceClient(dataLakeServiceUri.ToUri(),
                                      new DefaultAzureCredential());

        // Get a user delegation key that's valid for seven days.
        // You can use the key to generate any number of shared access signatures 
        // over the lifetime of the key.
        Azure.Storage.Files.DataLake.Models.UserDelegationKey userDelegationKey =
            await dataLakeServiceClient.GetUserDelegationKeyAsync(DateTimeOffset.UtcNow,
                                                                  DateTimeOffset.UtcNow.AddDays(7));

        // Create a SAS token that's valid for seven days.
        DataLakeSasBuilder sasBuilder = new DataLakeSasBuilder()
        {
            // Specify the file system name and path, and indicate that
            // the client object points to a directory.
            FileSystemName = directoryClient.FileSystemName,
            Resource = "d",
            IsDirectory = true,
            Path = directoryClient.Path,
            ExpiresOn = DateTimeOffset.UtcNow.AddDays(7)
        };

        // Specify racwl permissions for the SAS.
        sasBuilder.SetPermissions(
            DataLakeSasPermissions.Read |
            DataLakeSasPermissions.Add |
            DataLakeSasPermissions.Create |
            DataLakeSasPermissions.Write |
            DataLakeSasPermissions.List
            );

        // Construct the full URI, including the SAS token.
        DataLakeUriBuilder fullUri = new DataLakeUriBuilder(directoryClient.Uri)
        {
            Sas = sasBuilder.ToSasQueryParameters(userDelegationKey,
                                                  dataLakeServiceClient.AccountName)
        };

        Console.WriteLine("Directory user delegation SAS URI: {0}", fullUri);
        Console.WriteLine();
        return fullUri.ToUri();
    }
    catch (Exception e)
    {
        Console.WriteLine(e.Message);
        throw;
    }
}

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

private static async Task ListFilesPathsWithDirectorySasAsync(Uri sasUri)
{
    // Try performing an operation using the directory SAS provided.

    // Create a directory client object for listing operations.
    DataLakeDirectoryClient dataLakeDirectoryClient = new DataLakeDirectoryClient(sasUri);

    // List file paths in the directory.
    try
    {
        // Call the listing operation and return pages of the specified size.
        var resultSegment = dataLakeDirectoryClient.GetPathsAsync(false, false).AsPages();

        // Enumerate the file paths returned with each page.
        await foreach (Page<PathItem> pathPage in resultSegment)
        {
            foreach (PathItem pathItem in pathPage.Values)
            {
                Console.WriteLine("File name: {0}", pathItem.Name);
            }
            Console.WriteLine();
        }

        Console.WriteLine();
        Console.WriteLine("Directory listing operation succeeded for SAS {0}", sasUri);
    }
    catch (RequestFailedException e)
    {
        // Check for a 403 (Forbidden) error. If the SAS is invalid, 
        // Azure Storage returns this error.
        if (e.Status == 403)
        {
            Console.WriteLine("Directory listing operation failed for SAS {0}", sasUri);
            Console.WriteLine("Additional error information: " + e.Message);
            Console.WriteLine();
        }
        else
        {
            Console.WriteLine(e.Message);
            Console.ReadLine();
            throw;
        }
    }
}

موارد للتنمية باستخدام .NET

توفر الارتباطات أدناه موارد مفيدة للمطورين الذين يستخدمون موقع تخزين مكتبة العميل Azure ل .NET.

واجهات برمجة التطبيقات الشائعة للتخزين Azure

واجهات برمجة تطبيقات تخزين لكائن ثنائي كبير الحجم

أدوات الخاصة بـ.NET

راجع أيضًا