У меня есть группа ресурсов Azure, которая содержит службу веб-приложений и хранилище с контейнером BLOB. Мое веб-приложение (.NET Core) пытается извлечь и показать изображение из контейнера. Контейнер не имеет публичного доступа к контенту (уровень доступа приватный). Я создал системную идентификацию для моего приложения и дал ему роль Reader в управлении доступом к хранилищу (IAM).
Вот так я получаю доступ к BLOB-объектам в коде приложения:
const string blobName = "https://storagename.blob.core.windows.net/img/Coast.jpg";
string storageAccessToken = await GetStorageAccessTokenAsync();
var tokenCredential = new TokenCredential(storageAccessToken);
var storageCredentials = new StorageCredentials(tokenCredential);
var blob = new CloudBlockBlob(new Uri(blobName), storageCredentials);
ImageBlob = blob.Uri;
GetStorageAccessTokenAsync () делает это:
var tokenProvider = new AzureServiceTokenProvider();
return await tokenProvider.GetAccessTokenAsync("https://storage.azure.com/");
Затем изображение отображается как
<img src="@Model.ImageBlob" />
Я не получаю никаких исключений в своем коде, но изображение из контейнера BLOB не отображается с ошибкой 404 (указанный ресурс не существует) в консоли браузера.
Когда я изменяю уровень доступа контейнера на «blob» (публичный доступ), приложение работает нормально, и изображение отображается.
Видимо, что-то не так с получением части учетных данных, но я не смог найти ни рабочего примера, ни подробных объяснений, как это на самом деле должно работать.
Любая помощь очень ценится.
UDPATE:
Спасибо всем, кто откликнулся. Похоже, у меня тут две проблемы.
1) Я не получаю учетные данные должным образом.
Я вижу, что созданный мной объект "AzureServiceTokenProvider" (Microsoft.Azure.Services.AppAuthentication) имеет пустое свойство PrincipalUsed во время выполнения.
Мое приложение развернуто в службе приложений Azure, у которой есть удостоверение, управляемое системой, и этому удостоверению (субъекту службы) предоставлены разрешения в хранилище Azure (я изменил разрешение с устройства чтения учетных записей на средство чтения данных BLOB-объектов хранилища, как было предложено).
Разве он не должен получить все данные, необходимые из текущего контекста? Если нет, то что я могу сделать здесь?
2) Я использую неправильный метод для показа изображения, но так как приложение не имеет доступа к хранилищу, я пока не могу это исправить.
Но все же - каков общий способ сделать это в моем случае? Я имею в виду, что нет общего доступа к хранилищу, и я использую «CloudBlockBlob» для доступа к изображениям.