Невозможно получить доступ к BLOB-объекту хранилища Azure по URL-адресу, даже если он прошел проверку подлинности

У меня есть приложение nodejs, использующее экспресс-фреймворк. Пользователь должен войти в систему по протоколу Oauth2, используя свои учетные данные MS Azure Active Directory. Это делается с помощью пакета npm Passport-azure-ad-oauth2.

У меня успешно работает приложение, поэтому я могу загружать файлы в форме больших двоичных объектов в контейнер хранения Azure. Уровень доступа к контейнеру установлен как частный. Я назначил для контейнера роли пользователей, чтобы определенные пользователи в AD имели «доступ для чтения и данных». Насколько я понимаю, когда эти пользователи проходят аутентификацию через Oauth2, они должны иметь доступ к файлам при получении URL-адреса файла. Однако после аутентификации я не могу получить доступ к файлам. Я получаю следующую ошибку.

ResourceNotFound The specified resource does not exist. RequestId:6341ef80-f01e-0011-6442-08f7c2000000 Time:2021-02-21T11:14:26.3475641Z

Я также выполнил действия по предоставлению разрешений приложению для хранилища Azure здесь

Что мне нужно сделать, чтобы прошедшие проверку пользователи могли перейти по определенному URL-адресу для каждого большого двоичного объекта и получить доступ? Нужно ли передавать токен в запросе? Если да, то как это сделать?

Любая помощь приветствуется.


person b.b.89    schedule 21.02.2021    source источник


Ответы (1)


Ошибка 404 (Указанный ресурс не существует) всегда связана с URL-адресом вашего запроса, но не с токеном доступа.

Например, чтобы получить blob, вам необходимо использовать GET и некоторые заголовки запроса являются обязательными.

GET https://myaccount.blob.core.windows.net/mycontainer/myblob
headers:  
     Authorization: Bear <access-token>
     x-ms-version: 2020-04-08
     x-ms-date: Fri, 26 Jun 2015 23:39:12 GMT

Получите токен доступа по разрешению приложения без пользователя:

POST https://login.microsoftonline.com/{tenant}/oauth2/v2.0/token

client_id={client_id}
&client_secret={client_secret}
&scope=http://storage.azure.com/.default  // change to http://storage.azure.com/ for resource
&grant_type=client_credentials

Получите токен доступа по делегированному разрешению с авторизованным пользователем:

GET https://login.microsoftonline.com/{tenant}/oauth2/v2.0/authorize?
client_id={client_id}
&response_type=token
&redirect_uri=https://localhost:44300/
&scope=https://storage.azure.com/user_impersonation
&response_mode=fragment
&state=12345
&nonce=678910

Примечание. Перейдите в свою учетную запись хранения - ›Контроль доступа (IAM) -› Добавить назначение роли - ›выберите Storage Blob Data XXX роль и свою учетную запись для входа. Я добавляю на свою сторону участника Storage Blob Data Contributor, распространение правила RBAC может занять до 5 минут.

введите описание изображения здесь

person Pamela Peng    schedule 21.02.2021
comment
Спасибо. Извиняюсь, я все еще учусь. На каком этапе я получаю токен доступа сразу после входа в систему? Или я запрашиваю токен доступа каждый раз, когда хочу загрузить файл по URL-адресу? Как структурировать приложение так, чтобы токен доступа всегда был доступен после входа в систему, чтобы можно было загрузить любой файл, пока пользователь прошел проверку подлинности? - person b.b.89; 22.02.2021
comment
Обновление - мне удалось получить токен доступа с помощью почтальона. Однако, когда я пытаюсь использовать запрос GET для получения желаемого ресурса, я получаю ответ 403: не авторизован. - person b.b.89; 22.02.2021
comment
Вы можете получить токен доступа после входа в систему, см. Мой второй метод, используя неявный поток. Но токен доступа истечет через час, вам нужно получить его снова. Об ошибке 403 см. Примечание в моем ответе, и вам необходимо добавить разрешение API хранилища в свое приложение. - person Pamela Peng; 22.02.2021
comment
Спасибо за вашу помощь ... так что мне удалось получить ответ 200 в почтальоне, реплицируя ваш «делегированный ответ с кодом вошедшего пользователя» выше. Но мне просто интересно, где токен доступа? Я просто получаю заголовки set-cookie, fpc = etc ... еще раз спасибо за вашу помощь - person b.b.89; 22.02.2021
comment
Токен доступа не сохраняется автоматически. Если вы используете MSAL.js, вы можете сохранить его в кеше токенов, например здесь. - person Pamela Peng; 23.02.2021
comment
Привет, Памела, спасибо за помощь в этом. Приносим извинения за поздний ответ. Мне пришлось отложить работу, но сейчас я вернулся. У меня есть интерфейсное приложение для реагирования, в котором пользователь входит в приложение с помощью @ azure / msal-browser. Кажется, это возвращает токен и хранится в кеше. Могу ли я использовать этот токен (токен 1) для доступа к BLOB-объекту? Или мне нужно получить другой токен доступа (токен 2), используя, скажем, ваш третий фрагмент кода выше (получить токен делегированного пользователя)? Если да, нужно ли отправлять токен, полученный после первоначального входа в систему (токен 1), в запросе на получение токена 2? Надеюсь, это имеет смысл - person b.b.89; 05.04.2021