如何使用DefaultAzureCredential类及托管身份生成Azure Storage SAS令牌
使用托管身份生成Azure Blob SAS令牌
要替代共享密钥方式生成SAS令牌,你需要生成用户委派SAS——这是依托Azure AD身份验证授权的SAS,无需存储账户密钥。具体实现步骤和代码如下:
核心逻辑
- 通过托管身份创建Blob服务客户端,全程无需存储密钥
- 获取用户委派密钥:由Azure AD令牌授权生成,用于签名SAS(有效期最长7天)
- 用该密钥生成Blob SAS令牌
Go代码实现
import ( "context" "time" "github.com/Azure/azure-sdk-for-go/sdk/azidentity" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob" ) func GenerateUserDelegationSAS(accountName, containerName, blobName string) (string, error) { // 1. 用托管身份初始化Blob服务客户端(DefaultAzureCredential自动识别托管身份环境) cred, err := azidentity.NewDefaultAzureCredential(nil) if err != nil { return "", err } serviceURL := "https://" + accountName + ".blob.core.windows.net" blobServiceClient, err := azblob.NewBlobServiceClient(serviceURL, cred, nil) if err != nil { return "", err } // 2. 获取用户委派密钥(有效期和SAS保持一致,最长不超7天) keyStartTime := time.Now().UTC() keyExpiryTime := keyStartTime.Add(4 * time.Hour) userDelegationKey, err := blobServiceClient.GetUserDelegationKey(context.TODO(), keyStartTime, keyExpiryTime, nil) if err != nil { return "", err } // 3. 生成SAS令牌参数 sasParams, err := azblob.BlobSASSignatureValues{ Protocol: azblob.SASProtocolHTTPS, ExpiryTime: keyExpiryTime, ContainerName: containerName, BlobName: blobName, Permissions: azblob.BlobSASPermissions{Read: true}.String(), UserDelegationKey: userDelegationKey, StartsOn: keyStartTime, }.NewSASQueryParametersWithUserDelegationKey(accountName) if err != nil { return "", err } // 返回编码后的SAS查询字符串 return sasParams.Encode(), nil }
注意事项
- 托管身份需被授予存储账户的Storage Blob Data Contributor角色(或更细粒度的权限:允许获取用户委派密钥+读取Blob)
- 用户委派密钥有效期最长7天,若需长期生成SAS,要定期刷新密钥
- 该方式比共享密钥更安全:权限通过Azure AD角色管控,无需暴露存储密钥,操作可审计
内容的提问来源于stack exchange,提问作者randy
相关产品推荐
相关产品推荐

