Поделиться через


Создание SAS делегирования пользователей для контейнера или большого двоичного объекта с помощью .NET

Подписанный URL-адрес (SAS) позволяет предоставить ограниченный разрешениями доступ к контейнерам и BLOB-объектам в вашей учетной записи хранения. При создании SAS необходимо указать его ограничения, включая ресурсы службы хранилища Azure, к которым разрешен доступ клиенту, разрешения, предоставленные для доступа к этим ресурсам, а также срок действия SAS.

Каждый SAS подписывается ключом. Подписать SAS можно одним из двух способов:

  • С помощью ключа, созданного с помощью учетных данных Microsoft Entra. SAS, подписанный учетными данными Microsoft Entra, — это SAS делегирования пользователей. Клиенту, создающему SAS делегирования пользователей, должна быть назначена роль Azure RBAC, которая включает действие Microsoft.Storage/storageAccounts/blobServices/generateUserDelegationKey. Дополнительные сведения см. в статье "Создание SAS делегирования пользователей".
  • Ключом учетной записи хранения. Как SAS службы, так и SAS учетной записи подписываются ключом учетной записи хранения. Клиент, создающий SAS службы, должен иметь прямой доступ к ключу учетной записи или ему должно быть назначено разрешение Microsoft.Storage/storageAccounts/listkeys/action. Дополнительные сведения см. в статье "Создание SAS службы" или "Создание SAS учетной записи".

Примечание.

SAS делегирования пользователя обеспечивает более высокую безопасность по сравнению с SAS, подписанным ключом учетной записи хранения. Корпорация Майкрософт рекомендует по возможности использовать SAS делегирования пользователя. Дополнительные сведения см. в статье Предоставление ограниченного доступа к данным с помощью подписанных URL-адресов (SAS).

В этой статье показано, как использовать учетные данные Microsoft Entra для создания SAS делегирования пользователей для контейнера или большого двоичного объекта с помощью клиентской библиотеки служба хранилища Azure для .NET.

Общие сведения о SAS для делегирования пользователей

Маркер SAS для доступа к контейнеру или большому двоичному объекту может быть защищен с помощью учетных данных Microsoft Entra или ключа учетной записи. SAS, защищенный учетными данными Microsoft Entra, называется SAS делегирования пользователей, так как маркер OAuth 2.0, используемый для подписи SAS, запрашивается от имени пользователя.

Корпорация Майкрософт рекомендует использовать учетные данные Microsoft Entra, если это возможно, как рекомендации по безопасности, а не использовать ключ учетной записи, который может быть проще скомпрометирован. Если для разработки приложения требуются подписанные URL-адреса, используйте учетные данные Microsoft Entra для создания SAS делегирования пользователей для обеспечения повышенной безопасности. Дополнительные сведения о SAS для делегирования пользователей см. в статье Создание SAS для делегирования пользователей.

Внимание

Любой клиент, обладающий действительным SAS, может получить доступ к данным в вашей учетной записи хранения в соответствии с тем, как это допускается этим SAS. Важно обеспечить для SAS защиту от вредоносного или непреднамеренного использования. Распространять SAS нужно с осторожность и следует подготовить план для отзыва скомпрометированного SAS.

Дополнительные сведения о подписанных URL-адресах см. в статье об использование подписанных URL-адресов SAS в службе хранилища Azure.

Назначение ролей Azure для доступа к данным

Когда субъект безопасности Microsoft Entra пытается получить доступ к данным, этот субъект безопасности должен иметь разрешения на ресурс. Независимо от того, является ли субъект безопасности управляемым удостоверением в Azure или учетной записи пользователя Microsoft Entra, выполняющей код в среде разработки, субъект безопасности должен быть назначен роли Azure, которая предоставляет доступ к данным. Дополнительные сведения о предоставлении разрешений в Azure RBAC см. в статье Назначение роли Azure для доступа к данным BLOB-объектов.

Настройка проекта

Чтобы работать с примерами кода в этой статье, выполните следующие действия, чтобы настроить проект.

Установка пакетов

Установите следующие пакеты:

dotnet add package Azure.Identity
dotnet add package Azure.Storage.Blobs

Настройка кода приложения

Затем добавьте следующие using директивы:

using Azure;
using Azure.Identity;
using Azure.Storage.Blobs;
using Azure.Storage.Blobs.Models;
using Azure.Storage.Blobs.Specialized;
using Azure.Storage.Sas;

Получение учетных данных токена, прошедшего проверку подлинности

Чтобы получить учетные данные маркера, которые код может использовать для авторизации запросов к хранилищу BLOB-объектов, создайте экземпляр класса DefaultAzureCredential . Дополнительные сведения об использовании класса DefaultAzureCredential для авторизации управляемого удостоверения для доступа к хранилищу BLOB-объектов см . в клиентской библиотеке удостоверений Azure для .NET.

В следующем фрагменте кода показано, как получить учетные данные токена, прошедшего проверку подлинности, а затем использовать их для создания клиента службы для Хранилища BLOB-объектов:

// Construct the blob endpoint from the account name.
string endpoint = $"https://{accountName}.blob.core.windows.net";

// Create a blob service client object using DefaultAzureCredential
BlobServiceClient blobServiceClient = new BlobServiceClient(
    new Uri(endpoint),
    new DefaultAzureCredential());

Дополнительные сведения о авторизации доступа к хранилищу BLOB-объектов из приложений с помощью пакета SDK для .NET см. в статье "Проверка подлинности приложений .NET с помощью служб Azure".

Получение ключа для делегирования пользователей

Каждый SAS подписывается ключом. Чтобы создать SAS для делегирования пользователей, необходимо сначала запросить ключ для делегирования пользователей, который позже нужно будет использовать для подписания SAS. Ключ делегирования пользователей аналогиен ключу учетной записи, используемому для подписи SAS службы или SAS учетной записи, за исключением того, что он использует учетные данные Microsoft Entra. Когда клиент запрашивает ключ делегирования пользователей с помощью маркера OAuth 2.0, хранилище BLOB-объектов возвращает ключ делегирования пользователей от имени пользователя.

После получения ключ для делегирования пользователей можно использовать, чтобы создать любое количество SAS для делегирования пользователей в течение времени существования ключа. Ключ делегирования пользователей не зависит от маркера OAuth 2.0, используемого для его получения, поэтому маркер не должен быть продлен, если ключ по-прежнему действителен. Можно указать срок действия ключа до семи дней.

Используйте один из следующих методов, чтобы запросить ключ для делегирования пользователей:

В следующем примере кода показано, как запросить ключ делегирования пользователей:

public static async Task<UserDelegationKey> RequestUserDelegationKey(
    BlobServiceClient blobServiceClient)
{
    // Get a user delegation key for the Blob service that's valid for 1 day
    UserDelegationKey userDelegationKey =
        await blobServiceClient.GetUserDelegationKeyAsync(
            DateTimeOffset.UtcNow,
            DateTimeOffset.UtcNow.AddDays(1));

    return userDelegationKey;
}

Создание SAS для делегирования пользователя

Вы можете создать SAS делегирования пользователей для контейнера или большого двоичного объекта в зависимости от потребностей приложения.

Получив ключ делегирования пользователей, можно создать SAS делегирования пользователей, чтобы делегировать ограниченный доступ к контейнеру. В следующем примере кода показано, как создать SAS делегирования пользователей для контейнера:

public static async Task<Uri> CreateUserDelegationSASContainer(
    BlobContainerClient containerClient,
    UserDelegationKey userDelegationKey)
{
    // Create a SAS token for the container resource that's also valid for 1 day
    BlobSasBuilder sasBuilder = new BlobSasBuilder()
    {
        BlobContainerName = containerClient.Name,
        Resource = "c",
        StartsOn = DateTimeOffset.UtcNow,
        ExpiresOn = DateTimeOffset.UtcNow.AddDays(1)
    };

    // Specify the necessary permissions
    sasBuilder.SetPermissions(BlobSasPermissions.Read | BlobSasPermissions.Write);

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

    return uriBuilder.ToUri();
}

Использование SAS делегирования пользователей для авторизации клиентского объекта

Sas делегирования пользователей можно использовать для авторизации клиентского объекта для выполнения операций с контейнером или BLOB-объектом на основе разрешений, предоставленных SAS.

В следующем примере кода показано, как использовать SAS делегирования пользователей для авторизации объекта BlobContainerClient . Этот клиентский объект можно использовать для выполнения операций с ресурсом контейнера на основе разрешений, предоставленных SAS.

// Create a Uri object with a user delegation SAS appended
BlobContainerClient containerClient = blobServiceClient
    .GetBlobContainerClient("sample-container");
Uri containerSASURI = await CreateUserDelegationSASContainer(containerClient, userDelegationKey);

// Create a container client object with SAS authorization
BlobContainerClient containerClientSAS = new BlobContainerClient(containerSASURI);

Ресурсы

Дополнительные сведения о создании SAS делегирования пользователей с помощью клиентской библиотеки Хранилище BLOB-объектов Azure для .NET см. в следующих ресурсах.

Примеры кода

Операции REST API

Пакет SDK Azure для .NET содержит библиотеки, которые создаются на основе REST API Azure, что позволяет взаимодействовать с операциями REST API через знакомые парадигмы .NET. Метод клиентской библиотеки для получения ключа делегирования пользователей использует следующую операцию REST API:

Ресурсы клиентской библиотеки

См. также

  • Эта статья является частью руководства разработчика хранилища BLOB-объектов для .NET. Дополнительные сведения см. в полном списке статей руководства разработчика по созданию приложения .NET.