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

Java 如何在azure存储blob中生成许可下载链接,java,azure,download,blob,azure-storage-blobs,Java,Azure,Download,Blob,Azure Storage Blobs,我可以通过这些代码获得一个链接,它可以成功下载一个文件 BlobContainerSasPermission blobContainerSasPermission = new BlobContainerSasPermission() .setReadPermission(true) .setWritePermission(true) .setListPermission(true); BlobServ

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

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));
但是每个人都可以通过这个链接下载该文件,我希望该文件可以由授权的人下载。是否有任何代码或azure的设置(如AD?)可以实现这一点?谢谢

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

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

<dependency>
    <groupId>com.azure</groupId>
    <artifactId>azure-storage-blob</artifactId>
    <version>12.11.0-beta.2</version>
</dependency>
然后我得到了状态代码401(InvalidAuthenticationInfo)

上帝啊,救救我

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

使用
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);

查看并获取实施详细信息。

看起来没有办法实现这一点


请在此处查看用户委派SA:。我尝试过此操作,但在最后一行遇到异常-->仅支持身份验证方案承载
OffsetDateTime expiryTime=OffsetDateTime.now().plusDays(1);BlobSasPermission权限=新建BlobSasPermission().setReadPermission(true);BlobServiceSasSignatureValues=new BlobServiceSasSignatureValues(expiryTime,permission).setProtocol(仅限SasProtocol.HTTPS_).setStartTime(OffsetDateTime.now());UserDelegationKey UserDelegationKey=blobServiceClient.getUserDelegationKey(OffsetDateTime.now(),expiryTime)状态代码403,“
AuthenticationFailed
服务器无法对请求进行身份验证。请确保包含签名的授权标头的值格式正确。请求ID:6c4b7821-b01e-0022-07c7-4B94E500000时间:2021-05-18T09:20:28.9329978支持区域身份验证方案承载”我该怎么办?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);