AddDataProtection().PersistKeysToAzureBlobStorage().ProtectKeysWithAzureKeyVault() получает ошибку httpVerb при доступе к хранилищу BLOB-объектов

Приложение размещается в сценарии веб-фермы. У меня нет возможности сохранять ключи для защиты данных() в базе данных. Я не могу сохранить файл ключа в хранилище BLOB-объектов.

Я сослался на документацию и использовал эти строки кода для хранения ключевого файла в blob.

builder.Services.AddDataProtection().PersistKeysToAzureBlobStorage('blob-sas-uri')
.ProtectKeysWithAzureKeyVault('keyvault identifier')

Когда я запускаю приложение, я получаю следующую ошибку.

RequestFailedException: The resource doesn't support specified Http Verb.
 ErrorCode: UnsupportedHttpVerb Content:
Azure.Storage.Blobs.BlockBlobRestClient.Upload(long contentLength, Stream body, Nullable<int> timeout, byte[] transactionalContentMD5, string blobContentType, string blobContentEncoding, string blobContentLanguage,...

Мне не хватает какой-либо конфигурации на портале Azure?

Заранее спасибо.

Моя первая мысль: что-то не так с URI BLOB-объекта. Можете ли вы заменить личные значения (имя учетной записи хранения и т. д.) общими значениями и опубликовать здесь URI?

juunas 27.06.2024 08:09

Должно быть примерно так builder.Services.AddAzureClients(cb => { cb.AddBlobServiceClient(new Uri("https://rithwik.blob.core.windows.net/rithwik/tt.xml"))‌​; }); builder.Services.AddDataProtection() .PersistKeysToAzureBlobStorage(new Uri("https://rithwik.blob.core.windows.net/rithwik/tt.xml?sp‌​=racwdyti&st=2024-06‌​-27T07:15:41Z&se=202‌​4-06-27T15:15:41Z&sp‌​r=https&sv=2022-11-0‌​2&sr=b&sig=fgjj%3D")‌​) .ProtectKeysWithAzureKeyVault(new Uri("https://rith98.vault.azure.net/secrets/test"), new DefaultAzureCredential());

RithwikBojja 27.06.2024 09:31

@juunas Вот URL-адрес большого двоичного объекта, который я использую https://<blob-name>.blob.core.windows.net/<container-name>?c‌​omp=list&restype=con‌​tainer&sp=racwdli&st‌​=2024-06 -27T05:01:30‌Z&se=2024-06-28T13:0‌1:30Z&skoid=<skoid>&‌​sktid=<sktid>&skt=20‌​24-06-27T05:01:30Z&s‌​ke=2024-06 -28T13:01:‌​30Z&sks=b&skv=<skv-d‌​ate>&sv=<sv-date>&sr‌​=c&sig=<signature-va‌​lue>

roopteja 27.06.2024 17:22

Это URL-адрес контейнера, а не большого двоичного объекта. Вам нужно создать большой двоичный объект и создать для этого URL-адрес SAS. Или сделайте то, что предложил RithwikBojja в своем ответе, и вместо этого используйте аутентификацию Entra ID.

juunas 27.06.2024 19:48
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
Как установить LAMP Stack 1/2 на Azure Linux VM
Как установить LAMP Stack 1/2 на Azure Linux VM
В дополнение к нашему предыдущему сообщению о намерении Azure прекратить поддержку Azure Database для MySQL в качестве единого сервера после 16...
0
4
110
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

код для хранения ключевого файла в большом двоичном объекте.

В качестве альтернативы URL-адресу SAS я предоставил роль участника хранилища RBAC и роль пользователя KeyVault Crypto. Я использовал приведенный ниже код, и он работает для меня:

Программа.cs:

rith_b.Services.AddAzureClients(ri_cb =>
{
    ri_cb.AddBlobServiceClient(new Uri("https://rithwik.blob.core.windows.net"));
});
rith_b.Services.AddDataProtection()
    .PersistKeysToAzureBlobStorage(new Uri("https://rithwik.blob.core.windows.net/rithwik/test.xml"), new DefaultAzureCredential())
    .ProtectKeysWithAzureKeyVault(new Uri("https://rith98.vault.azure.net/keys/test"), new DefaultAzureCredential());

Введите ключ в KeyVault:

Выход:

Blob создан:

Редактировать:

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

Для облака вы можете использовать:

using Azure.Identity;
-----
-----
string clntId = "xxx";
string clntSecret = "xxx";
string tenantId = "xxx";
var r_cred = new ClientSecretCredential(tenantId, clntId, clntSecret);
rith_b.Services.AddAzureClients(ri_cb =>
{
    ri_cb.AddBlobServiceClient(new Uri("https://rithwik.blob.core.windows.net"))
                 .WithCredential(r_cred);
});
rith_b.Services.AddDataProtection()
    .PersistKeysToAzureBlobStorage(new Uri("https://stgname.blob.core.windows.net/rithwik/test.xml"), r_cred)
    .ProtectKeysWithAzureKeyVault(new Uri("https://keyvaultname.vault.azure.net/keys/test"), r_cred);
-----
-----

Я использовал этот код, и он отлично работает на локальном компьютере. но при развертывании в рабочей среде я получаю эту ошибку: «Произошла ошибка при чтении набора ключей. Azure.Identity.CredentialUnavailableException: DefaultAzureCredential не удалось получить токен из включенных учетных данных. Дополнительные сведения см. в руководстве по устранению неполадок».

roopteja 27.06.2024 18:09

Для облака вы можете использовать секрет клиента, идентификатор клиента, идентификатор клиента и регистрацию приложения. Для этого субъекта-службы вам необходимо назначить роли. Также обратите внимание на это

RithwikBojja 27.06.2024 18:48

Я отредактировал свой ответ в разделе редактирования, пожалуйста, проверьте его @roopteja

RithwikBojja 27.06.2024 18:58

так этот идентификатор клиента, секрет клиента будут специфичны для больших двоичных объектов и хранилища ключей? или это связано с регистрацией приложения, которое я использую в этом приложении?

roopteja 27.06.2024 19:02

Никакая регистрация приложения не является частью Microsoft Entra Id (AD). Также проверьте это и это для получения дополнительной информации о регистрации приложения.

RithwikBojja 27.06.2024 19:14

Хорошо, понял. Итак, где я возьму этот идентификатор клиента и секрет клиента? Я проверил свойства хранилища BLOB-объектов, но не смог найти эти значения.

roopteja 27.06.2024 19:19

Давайте продолжим обсуждение в чате.

roopteja 27.06.2024 19:21

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

Как объявить параметр функции, чтобы он принимал все производные типы универсального абстрактного типа?
SQLite выдает исключение во время открытия соединения, когда SingleFile имеет значение true
Как использовать AddIdentityApiEndpoints внутри библиотеки классов?
Реализация ограничения скорости для общедоступных конечных точек в C# и .NET Core для предотвращения атак методом перебора
CancellationToken в функции контроллера .Net Core внезапно становится истинным
Быстрая параллельная загрузка множества больших двоичных объектов в Azure в .NET
Является ли суффикс контроллера обязательным в .NET Core (.NET 6)?
EntraID: как передать роли приложения ниже по течению
Asp.net core 8 выбирает несколько с выбранным по умолчанию, не работает после обновления
Параллельные задачи. Запускайте параллельные потоки, но не ждите завершения других задач и получайте последние данные из базы данных

Похожие вопросы