如何创建支持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权限管控访问范围,还可以设置过期时间降低泄露风险。
具体操作步骤:
- 给你的应用分配权限:确保上传文件的应用拥有
Storage Blob Delegator权限(可以在存储账户/资源组/订阅级别分配),这样应用才能代表AD用户生成SAS令牌。 - 生成带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}"; - 用户访问:员工收到这个带SAS的链接后,直接在浏览器打开就能下载——因为SAS是基于AD权限生成的,只有组织内拥有Blob Reader权限的用户才能正常访问,外部用户拿到链接也没用。
方案二:Azure AD OAuth2认证直接访问(无SAS,更安全)
如果不想用SAS,也可以让浏览器先完成Azure AD登录,再用访问令牌访问Blob。这种方式完全依赖AD身份,没有令牌泄露风险,但需要额外处理认证流程。
具体操作思路:
- 不要直接发原始Blob URL:而是创建一个简单的跳转页面,当用户点击邮件里的链接时,先跳转到这个页面。
- 触发AD认证:在跳转页面中,引导用户完成Azure AD登录(如果用户已经在浏览器登录过组织账号,会自动单点登录),获取访问Azure Storage的令牌。
- 请求Blob下载:用拿到的访问令牌发起GET请求到Blob地址,浏览器会自动触发下载。
这种方式适合对安全性要求极高的场景,但需要额外开发跳转页面的逻辑。
关键注意事项
- 保持容器访问级别为Private (no anonymous access),绝对不要改成Blob匿名访问,否则会失去AD管控。
- 确认测试用户的权限:必须拥有Storage Data Blob Reader权限(数据权限),而不仅仅是Storage Account的Reader(管理权限)——你之前的设置是对的,继续保持。
- Azure Storage Explorer能正常访问是因为它会自动用用户的AD身份获取令牌,而浏览器直接访问不会做这个操作,这就是两者的差异。
内容的提问来源于stack exchange,提问作者Oliver Nilsen
相关产品推荐
相关产品推荐

