Azure SDK .NET — пакетное удаление больших двоичных объектов с помощью SAS

У меня есть SAS-контейнер BLOB-объектов с разрешениями на добавление/создание/запись/удаление (без чтения, без списка). И мне нужно удалить BLOB-объекты в этом контейнере пакетно:

try
{
    string sasToken = "sv=2023-0103&si=wd&sr=c&sig=blah-blah-blah";

    BlobContainerClient contClient = new(CreateContainerUrl(container), new AzureSasCredential(sasToken));
    BlobBatchClient batchClient = new(contClient);
    await batchClient.DeleteBlobsAsync(blobUris);
}
catch (Exception ex)
{
    _logger.LogError(ex, "Failed to delete multiple blobs in \"{0}\" container", container);
    throw;
}

Но я получаю ошибку:

Статус: 403 (Этому запросу не разрешено выполнять эту операцию с использованием этого разрешения.)

Код ошибки: Авторизацияпермисмисматч

Что я делаю не так?

Ваш токен SAS имеет разрешения si (подписанный идентификатор). Просто интересно, не опечатка ли это.

Gaurav Mantri 05.06.2024 22:54

Токен основан на политике «wd» (WriteDelete).

AlexB 05.06.2024 23:08
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
59
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Статус: 403 (Этому запросу не разрешено выполнять эту операцию с использованием этого разрешения.)

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

В моей учетной записи хранения я сохранил несколько файлов с именем контейнера test.

Портал:

Теперь я создал Access policy с именем sample1 с разрешения Add/Create/Write/Delete.

Портал:

Теперь я сгенерировал токен SAS, используя политику доступа, используя портал.

Портал:

Теперь, используя приведенный ниже код, я могу удалить капли, используя токен SAS.

Код:

using Azure;
using Azure.Storage.Blobs;
using Azure.Storage.Blobs.Specialized;
using Microsoft.Extensions.Logging;

public class BlobDeletionService
{
    private readonly ILogger<BlobDeletionService> _logger;

    public BlobDeletionService(ILogger<BlobDeletionService> logger)
    {
        _logger = logger;
    }

    public async Task DeleteBlobsAsync(string sasToken, string containerUrl, List<Uri> blobUris)
    {
        try
        {
            BlobContainerClient contClient = new BlobContainerClient(new Uri(containerUrl), new AzureSasCredential(sasToken));

            BlobBatchClient batchClient = new BlobBatchClient(contClient);

            await batchClient.DeleteBlobsAsync(blobUris);
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "Failed to delete multiple blobs in \"{0}\" container", containerUrl);
            throw;
        }
    }
}
   
public class Program
{
    private static async Task Main(string[] args)
    {
        using var loggerFactory = LoggerFactory.Create(builder =>
        {
            builder.AddConsole();
        });
        ILogger<BlobDeletionService> logger = loggerFactory.CreateLogger<BlobDeletionService>();
  
        string sasToken = "st=2024-06-06T05:18:31Z&se=2024-06-06T13:18:31Z&si=sample1&spr=https&sv=2022-11-02&sr=c&sig=HDvVDqokkxxxcbxxxxxD";
        string containerUrl = "https://venkat123.blob.core.windows.net/test";

        List<Uri> blobUris = new List<Uri>
        {
            new Uri("https://venkat123.blob.core.windows.net/test/sample2.ps1"),
            new Uri("https://venkat123.blob.core.windows.net/test/industry.csv.gpg")
        };

        BlobDeletionService deletionService = new BlobDeletionService(logger);
        await deletionService.DeleteBlobsAsync(sasToken, containerUrl, blobUris);
    }
}

Приведенный выше код выполнил и удалил два больших объекта в моей среде.

Портал:

Ссылка: Клиентская библиотека Azure Storage Blobs Batch для .NET — Azure для разработчиков .NET | Microsoft Learn

ок, моя вина. Токен Sas недействителен :/

AlexB 06.06.2024 17:29

Рад знать, что это помогло :)

Venkatesan 10.06.2024 13:20

Другие вопросы по теме

Необходимо ПОЛУЧИТЬ токен OAuth только с идентификатором клиента, без секретного кода клиента и URL-адресом перенаправления
Как в Azure Logic Apps получить результаты SQL-запроса в формате JSON и заполнить массив, чтобы можно было использовать результаты в виде условной логики?
Невозможно передать аннотации в Helm
«ODataError: один из предоставленных аргументов неприемлем» при попытке составить список DocumentSetVersions с помощью Microsoft Graph SDK
Отключите TipMix и файл cookie x-ms-routing-name с веб-сайта
Использование LogMetric в изолированном режиме Azure Function 8.0
Как получить код авторизации в MS Graph API 6.12
Функция Azure завершается сбоем из-за ошибки: неправильное имя пользователя или пароль: C:\host\LogFiles\Application\Function\Host
Невозможно получить DurableClient в изолированной dotnet функции для устойчивой обработки объектов
Приложение-функция Azure (python). Повторная попытка с timer_trigger не работает