У меня есть 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 (Этому запросу не разрешено выполнять эту операцию с использованием этого разрешения.)
Код ошибки: Авторизацияпермисмисматч
Что я делаю не так?
Токен основан на политике «wd» (WriteDelete).
Статус: 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);
}
}
Приведенный выше код выполнил и удалил два больших объекта в моей среде.
Портал:
ок, моя вина. Токен Sas недействителен :/
Рад знать, что это помогло :)
Ваш токен SAS имеет разрешения
si
(подписанный идентификатор). Просто интересно, не опечатка ли это.