Я использую .net core webapp mvc для получения данных из большого двоичного объекта в учетной записи хранения с использованием токенов oauth, но получаю ошибку «авторизация не разрешена». Раньше я пытался отобразить токен доступа в приложении, и проблем не возникло. Я также могу войти и выйти из системы без проблем
В Azure у меня есть регистрация приложения, в которую я добавил настраиваемые конечные точки openid для входа и выхода, соответствующие моей среде. Я также добавил разрешение API user_impersonation для хранилища Azure в регистрацию приложения.
В учетной записи хранения Azure я добавил в объект приложения роли читателя и читателя данных больших двоичных объектов Azure.
В моем файле appsettings.json у меня есть переменная «AzureAD», содержащая обычные параметры, такие как tenantid, clientid, cleintsecret, экземпляр, путь обратного вызова и т. д.
В моем файле launchsetting.json URL-адрес приложения такой же, как тот, который использовался на портале Azure.
Обычно это должно работать. Мне просто нужно иметь возможность просматривать содержимое большого двоичного объекта из моего приложения.
Я просмотрел Microsoft Learn, но не нашел решения.
Найдите прикрепленный скриншот сообщений об ошибках.
Если я смогу просто узнать некоторые из возможных причин этого конкретного сообщения об ошибке, это действительно поможет, поскольку я провел много поисков, но они продолжают указывать мне на назначение ролей, что не может быть здесь проблемой.
Позвольте мне также добавить, что я использую класс TokenAcquisitionTokenCredential, хотя он и устарел, но все еще поддерживается и не должен быть причиной ошибки во время выполнения.
Я ожидаю увидеть содержимое большого двоичного объекта, отображаемого в моем браузере. В приведенном ниже сегменте кода показано, где это действительно происходит:
public async Task<IActionResult> Index()
{
string[] scopes = new string[] { "https://storage.azure.com/user_impersonation" };
Uri blobUri = new Uri("https://xxxxxxxxxx.blob.core.windows.net/data/testfile.txt");
TokenAcquisitionTokenCredential credential = new TokenAcquisitionTokenCredential(tokenAcquisition);
BlobClient blobClient = new BlobClient(blobUri, credential);
MemoryStream ms = new MemoryStream();
blobClient.DownloadTo(ms);
ms.Position = 0;
StreamReader _reader = new StreamReader(ms);
string str = _reader.ReadToEnd();
ViewBag.content = str;
return View();
}
Найдите ниже сообщения об ошибках, которые отображались
После успешного входа в систему вместо содержимого большого двоичного объекта отображается эта ошибка:

Скриншот сообщения об ошибке:

Снимок экрана с сообщением об ошибке после использования OnBehalfOfCredential на основе первого предоставленного ответа:






Во-первых, у нас есть официальный документ, который демонстрирует использование DefaultAzureCredential для аутентификации BlobServiceClient, коды выглядят так, как показано ниже.
public BlobServiceClient GetBlobServiceClient(string accountName)
{
BlobServiceClient client = new(
new Uri($"https://{accountName}.blob.core.windows.net"),
new DefaultAzureCredential());
return client;
}
Также упоминалось, что
Если вы точно знаете, какой тип учетных данных вы будете использовать для аутентификации пользователи, вы можете получить токен OAuth, используя другие классы в Клиентская библиотека Azure Identity для .NET
Затем я попытался найти все реализации TokenCredential, но не нашел TokenAcquisitionTokenCredential, который вы использовали в своем коде. Чтобы вы могли использовать кастом TokenCredential.
Я предлагаю сначала использовать DefaultAzureCredential для завершения подключения к хранилищу Azure. Поскольку у нас уже есть приложение Azure AD, предоставляющее необходимое разрешение API. Мы можем установить Переменную среды, чтобы она прошла аутентификацию. AZURE_CLIENT_ID AZURE_TENANT_ID AZURE_CLIENT_SECRET. Затем, используя код в начале, проверьте соединение.
Если вы не считаете это хорошим вариантом и все же хотите использовать токен доступа для получения TokenCredential, я думаю, мы можем использовать OnBehalfOfCredential.
var tenantId = "xxxx";
var clientId = "xxxx";
var clientSecret = "xxxx";
var onBehalfOfCredential = new OnBehalfOfCredential(tenantId, clientId, clientSecret, "{token_we_get_from_tokenAcquisition}");
BlobServiceClient client = new(
new Uri($"https://accountName.blob.core.windows.net"),
onBehalfOfCredential);
Спасибо. Это исправлено. Я не использовал ваш код, но ваши идеи и ссылки побудили меня использовать некоторые работающие классы. Спасибо, сэр!
Спасибо, что вернулись и поделились такими добрыми словами :)
Перед использованием Azure.Identity + Microsoft.Identity.Web у меня был тест, чтобы использовать ITokenAcquisition для получения токена доступа. Вы можете проверить это, если вам не удалось получить токен. stackoverflow.com/a/77979513/14574199