首页 > 解决方案 > 即使经过身份验证,也无法通过 url 访问 Azure 存储 Blob

问题描述

我有一个使用 express 框架的 nodejs 应用程序。用户必须根据其 MS Azure Active Directory 凭据通过 Oauth2 协议登录。这是使用passport-azure-ad-oauth2 npm 包完成的

我已成功使应用程序正常工作,以便可以将 blob 形式的文件上传到 azure 存储容器。容器访问级别设置为私有。我已经为容器分配了用户角色,以便 AD 中的某些用户具有“读者和数据访问权限”。所以我的理解是,当这些用户通过 Oauth2 进行身份验证时,他们应该能够在检索文件的 URL 时访问这些文件。但是,经过身份验证后,我无法访问这些文件。我收到以下错误。

ResourceNotFound 指定的资源不存在。RequestId:6341ef80-f01e-0011-6442-08f7c2000000 时间:2021-02-21T11:14:26.3475641Z

我还按照步骤在此处授予应用程序对 azure 存储的权限

我需要做什么才能使经过身份验证的用户可以转到每个 blob 的特定 url 并获得访问权限?我需要在请求中传递令牌吗?如果是这样,你如何做到这一点?

任何帮助将非常感激。

标签: node.jsazureazure-active-directoryazure-blob-storage

解决方案


404 错误(指定的资源不存在)始终与您的请求 URL 有关,但与访问令牌无关。

例如要获取 blob,您需要使用GET方法,并且需要一些 Request Headers。

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角色和您的登录帐户。我在我身边添加了存储 Blob 数据贡献者,传播 RBAC 规则可能需要 5 分钟。

在此处输入图像描述


推荐阅读