如何在 azure 存储 blob 中生成许可下载链接

Posted

技术标签:

【中文标题】如何在 azure 存储 blob 中生成许可下载链接【英文标题】:How can I generate a licensed download link in azure storage blob 【发布时间】:2021-08-06 12:40:39 【问题描述】:

我可以通过这些代码得到一个链接,它可以成功下载一个文件。

BlobContainerSasPermission blobContainerSasPermission = new BlobContainerSasPermission()
                .setReadPermission(true)
                .setWritePermission(true)
                .setListPermission(true);
BlobServiceSasSignatureValues builder = new BlobServiceSasSignatureValues(OffsetDateTime.now().plusDays(1), blobContainerSasPermission)
                .setProtocol(SasProtocol.HTTPS_ONLY);
BlobClient client = new BlobClientBuilder()
                .connectionString("connection string")
                .blobName("")
                .buildClient();
String blobContainerName = "test";
return String.format("https://%s.blob.core.windows.net/%s?%s",client.getAccountName(), blobContainerName, client.generateSas(builder));

但是每个人都可以通过这个链接下载文件,我希望文件可以由授权的人下载。是否有任何代码或天蓝色的设置(例如 AD?)可以实现这一点?谢谢

--------------更新---------- ---

我找到了doc,并给出了原因。 注意:此方法调用仅在该对象的 HttpPipeline 中使用 TokenCredential 时有效。 但是在我导入的包中只有 BasicAuthenticationCredential 实现了 TokenCredential 。这是我的 mvn。

<dependency>
    <groupId>com.azure</groupId>
    <artifactId>azure-storage-blob</artifactId>
    <version>12.11.0-beta.2</version>
</dependency>

我试过了

String userName = "userName";
String password = "password";
BasicAuthenticationCredential basicAuthenticationCredential = new BasicAuthenticationCredential(userName,password);
BlobServiceClient blobServiceClient = new BlobServiceClientBuilder().endpoint(endpoint).credential(basicAuthenticationCredential).buildClient();

然后我得到了这个状态码 401,(InvalidAuthenticationInfo)

各位大神,救救我吧!

【问题讨论】:

在这里查看用户委托 SAS:docs.microsoft.com/en-us/rest/api/storageservices/…。 【参考方案1】:

用于访问容器、目录或 blob 的 SAS 令牌可能是 通过使用 Azure AD 凭据或帐户密钥进行保护。 SAS 使用 Azure AD 凭据进行保护称为用户委托 SAS。 Microsoft 建议尽可能使用 Azure AD 凭据 作为安全最佳实践,而不是使用帐户密钥, 可能更容易受到损害。当您的应用程序设计需要 共享访问签名,使用 Azure AD 凭据创建用户 委托 SAS 以实现卓越的安全性。

使用UserDelegationKey生成 SAS 查询参数

以下示例为 Azure 存储容器生成 SAS 查询参数。

BlobSasPermission blobPermission = new BlobSasPermission()
    .setReadPermission(true)
    .setWritePermission(true);

// We are creating a SAS to a container because only container name is set.
BlobServiceSasSignatureValues builder = new BlobServiceSasSignatureValues()
    .setProtocol(SasProtocol.HTTPS_ONLY) // Users MUST use HTTPS (not HTTP).
    .setExpiryTime(OffsetDateTime.now().plusDays(2))
    .setContainerName("my-container")
    .setPermissions(blobPermission);

// Get a user delegation key after signing in with Azure AD
UserDelegationKey credential = new UserDelegationKey();
String account = "my-blob-storage-account";
BlobServiceSasQueryParameters sasQueryParameters = builder.generateSasQueryParameters(credential, account);

查看Create a user delegation SAS 和this 了解实施详情。

【讨论】:

我试过了,但最后一行出现异常 --> 仅支持身份验证方案 Bearer OffsetDateTime expiryTime = OffsetDateTime.now().plusDays(1); BlobSasPermission permission = new BlobSasPermission().setReadPermission(true); BlobServiceSasSignatureValues values = new BlobServiceSasSignatureValues(expiryTime, permission).setProtocol(SasProtocol.HTTPS_ONLY).setStartTime(OffsetDateTime.now()); UserDelegationKey userDelegationKey = blobServiceClient.getUserDelegationKey(OffsetDateTime.now(),expiryTime); 状态码 403, "AuthenticationFailed服务器未能验证请求. 确保 Authorization header 的值包含签名正确形成 RequestId:6c4b7821-b01e-0022-07c7-4b94e5000000 Time:2021-05-18T09:20:28.9329978Z只有认证方案Bearer是支持" 我该怎么办? SAS 好像没有正确创建【参考方案2】:

好像没有办法实现。

This is the answer.

【讨论】:

以上是关于如何在 azure 存储 blob 中生成许可下载链接的主要内容,如果未能解决你的问题,请参考以下文章

在 Java 中生成 SAS 令牌以下载 Azure 数据存储容器中的文件

无法使用 Microsoft 示例在 Azure APIM 中生成 SAS

Azure Webjob - 访问本地文件系统

Azure Bot 脚本未保存

我们如何使用代理和 NodeJS 从 azure 存储下载 blob?

使用 openxml 将行追加到 azure blob 存储中的 excel