You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建支持Azure AD认证且允许通过浏览器直接URL下载的Azure Storage只读Blob容器

解决方案:支持Azure AD认证的只读Blob容器(可直接浏览器下载)

我完全懂你的痛点——既要用Azure AD把访问权限牢牢锁在组织内部,又要让员工能直接点邮件里的链接下载文件,还不能开匿名访问给外人钻空子。咱们一步步把这个问题解决掉:

首先得明确核心问题:你直接发给用户的Blob原始URL(比如https://sareadonly01.blob.core.windows.net/myreadonlycontainer01/TestFile01.txt)默认是走匿名访问的,浏览器不会自动触发Azure AD认证流程,所以即使用户有AD权限,也会被Azure以「资源不存在」的安全提示拒绝(这是Azure的防信息泄露策略,实际是权限不足)。

下面是两种靠谱的解决方案,按需选择:

方案一:用户委托SAS令牌(推荐,最简便)

用户委托SAS是基于Azure AD身份生成的临时访问令牌,而不是用存储账户密钥生成的。它既能让用户直接点击链接下载,又能通过AD权限管控访问范围,还可以设置过期时间降低泄露风险。

具体操作步骤:

  1. 给你的应用分配权限:确保上传文件的应用拥有Storage Blob Delegator权限(可以在存储账户/资源组/订阅级别分配),这样应用才能代表AD用户生成SAS令牌。
  2. 生成带SAS的Blob链接:当应用上传完文件后,不要直接发原始URL,而是生成用户委托SAS并附加到URL后面,再发给用户。
    举个.NET SDK的示例代码(其他语言SDK逻辑类似):
    // 初始化Blob服务客户端(用应用的Azure AD身份)
    var blobServiceClient = new BlobServiceClient(
        new Uri("https://sareadonly01.blob.core.windows.net/"),
        new DefaultAzureCredential());
    
    // 获取用户委托密钥(有效期自己调整,比如24小时)
    var userDelegationKey = await blobServiceClient.GetUserDelegationKeyAsync(
        DateTimeOffset.UtcNow,
        DateTimeOffset.UtcNow.AddHours(24));
    
    // 定位到目标Blob
    var blobClient = blobServiceClient.GetBlobClient("myreadonlycontainer01", "TestFile01.txt");
    
    // 构建SAS令牌,只赋予只读权限
    var sasBuilder = new BlobSasBuilder()
    {
        BlobContainerName = "myreadonlycontainer01",
        BlobName = "TestFile01.txt",
        Resource = "b", // 代表单个Blob
        StartsOn = DateTimeOffset.UtcNow,
        ExpiresOn = DateTimeOffset.UtcNow.AddHours(24)
    };
    sasBuilder.SetPermissions(BlobSasPermissions.Read);
    
    // 生成SAS令牌并拼接成可访问的URL
    var sasToken = sasBuilder.ToSasQueryParameters(userDelegationKey, "sareadonly01").ToString();
    var downloadableUrl = $"{blobClient.Uri}?{sasToken}";
    
  3. 用户访问:员工收到这个带SAS的链接后,直接在浏览器打开就能下载——因为SAS是基于AD权限生成的,只有组织内拥有Blob Reader权限的用户才能正常访问,外部用户拿到链接也没用。

方案二:Azure AD OAuth2认证直接访问(无SAS,更安全)

如果不想用SAS,也可以让浏览器先完成Azure AD登录,再用访问令牌访问Blob。这种方式完全依赖AD身份,没有令牌泄露风险,但需要额外处理认证流程。

具体操作思路:

  1. 不要直接发原始Blob URL:而是创建一个简单的跳转页面,当用户点击邮件里的链接时,先跳转到这个页面。
  2. 触发AD认证:在跳转页面中,引导用户完成Azure AD登录(如果用户已经在浏览器登录过组织账号,会自动单点登录),获取访问Azure Storage的令牌。
  3. 请求Blob下载:用拿到的访问令牌发起GET请求到Blob地址,浏览器会自动触发下载。

这种方式适合对安全性要求极高的场景,但需要额外开发跳转页面的逻辑。

关键注意事项

  • 保持容器访问级别为Private (no anonymous access),绝对不要改成Blob匿名访问,否则会失去AD管控。
  • 确认测试用户的权限:必须拥有Storage Data Blob Reader权限(数据权限),而不仅仅是Storage Account的Reader(管理权限)——你之前的设置是对的,继续保持。
  • Azure Storage Explorer能正常访问是因为它会自动用用户的AD身份获取令牌,而浏览器直接访问不会做这个操作,这就是两者的差异。

内容的提问来源于stack exchange,提问作者Oliver Nilsen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 20:24:09