Приложение размещается в сценарии веб-фермы. У меня нет возможности сохранять ключи для защиты данных() в базе данных. Я не могу сохранить файл ключа в хранилище 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?
Заранее спасибо.
Должно быть примерно так 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=2024-06-27T15:15:41Z&spr=https&sv=2022-11-02&sr=b&sig=fgjj%3D")) .ProtectKeysWithAzureKeyVault(new Uri("https://rith98.vault.azure.net/secrets/test"), new DefaultAzureCredential());
@juunas Вот URL-адрес большого двоичного объекта, который я использую https://<blob-name>.blob.core.windows.net/<container-name>?comp=list&restype=container&sp=racwdli&st=2024-06 -27T05:01:30Z&se=2024-06-28T13:01:30Z&skoid=<skoid>&sktid=<sktid>&skt=2024-06-27T05:01:30Z&ske=2024-06 -28T13:01:30Z&sks=b&skv=<skv-date>&sv=<sv-date>&sr=c&sig=<signature-value>
Это URL-адрес контейнера, а не большого двоичного объекта. Вам нужно создать большой двоичный объект и создать для этого URL-адрес SAS. Или сделайте то, что предложил RithwikBojja в своем ответе, и вместо этого используйте аутентификацию Entra ID.


код для хранения ключевого файла в большом двоичном объекте.
В качестве альтернативы 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
так этот идентификатор клиента, секрет клиента будут специфичны для больших двоичных объектов и хранилища ключей? или это связано с регистрацией приложения, которое я использую в этом приложении?
Никакая регистрация приложения не является частью Microsoft Entra Id (AD). Также проверьте это и это для получения дополнительной информации о регистрации приложения.
Хорошо, понял. Итак, где я возьму этот идентификатор клиента и секрет клиента? Я проверил свойства хранилища BLOB-объектов, но не смог найти эти значения.
Давайте продолжим обсуждение в чате.
Моя первая мысль: что-то не так с URI BLOB-объекта. Можете ли вы заменить личные значения (имя учетной записи хранения и т. д.) общими значениями и опубликовать здесь URI?