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

在Azure Synapse Spark中动态生成存储账户SAS令牌的替代方法

在Azure Synapse Spark中动态生成SAS令牌的替代方案

针对你提到的场景——无法提前确定存储账户且Synapse不支持DefaultAzureCredentialBuilder(),可以通过以下两种可行方法动态生成SAS令牌:

方法一:利用Synapse内置TokenLibrary生成用户委托SAS

Synapse Spark提供了内置的TokenLibrary,可直接获取Azure AD访问令牌,以此替代DefaultAzureCredential完成存储账户认证,进而生成用户委托SAS。

步骤与代码示例

  1. 确保当前Synapse工作区的服务主体(或用户身份)拥有目标存储账户的存储Blob数据所有者/参与者等角色权限(这是生成用户委托SAS的必要前提)。
  2. Scala代码实现:
import com.azure.storage.blob.{BlobServiceClient, BlobServiceClientBuilder}
import com.azure.storage.blob.sas.{BlobServiceSasSignatureValues, BlobContainerSasPermission}
import com.azure.core.credential.AccessToken
import java.time.OffsetDateTime

// 动态传入目标存储账户名称
val accountName = "your-target-storage-account"
val endpoint = s"https://$accountName.blob.core.windows.net"

// 通过TokenLibrary获取存储服务的Azure AD访问令牌
val accessTokenStr = TokenLibrary.getAccessToken(s"https://storage.azure.com/")
val accessToken = new AccessToken(accessTokenStr, OffsetDateTime.now().plusHours(1))

// 用访问令牌构建BlobServiceClient
val serviceClient = new BlobServiceClientBuilder()
  .endpoint(endpoint)
  .credential(accessToken)
  .buildClient()

// 生成用户委托SAS(以容器为例)
val containerName = "your-target-container"
// 获取用户委托密钥
val userDelegationKey = serviceClient.getUserDelegationKey(OffsetDateTime.now(), OffsetDateTime.now().plusHours(1))

// 配置SAS权限与过期时间
val sasParams = new BlobServiceSasSignatureValues(
  OffsetDateTime.now().plusHours(1),
  new BlobContainerSasPermission().setReadPermission(true).setListPermission(true)
)
  .setContainerName(containerName)

// 生成最终SAS令牌
val sasToken = userDelegationKey.generateSas(sasParams)
println(s"用户委托SAS令牌:$sasToken")

方法二:通过存储账户密钥生成服务SAS(需安全存储密钥)

如果可以获取存储账户的访问密钥(建议从Azure Key Vault安全读取,绝对禁止硬编码),可直接用密钥生成服务SAS。

步骤与代码示例

  1. 确保Synapse工作区有权限访问目标Key Vault(用于读取存储账户密钥)。
  2. Scala代码实现:
import com.azure.storage.blob.sas.{BlobServiceSasSignatureValues, BlobContainerSasPermission}
import com.azure.storage.common.StorageSharedKeyCredential
import java.time.OffsetDateTime

// 动态传入存储账户名称、Key Vault名称和密钥对应的机密名称
val accountName = "your-target-storage-account"
val keyVaultName = "your-key-vault"
val secretName = "storage-account-key-secret"
val containerName = "your-target-container"

// 从Key Vault读取存储账户密钥
val accountKey = TokenLibrary.getSecret(keyVaultName, secretName)

// 创建共享密钥凭据
val sharedKeyCredential = new StorageSharedKeyCredential(accountName, accountKey)

// 配置SAS权限与过期时间
val sasParams = new BlobServiceSasSignatureValues(
  OffsetDateTime.now().plusHours(1),
  new BlobContainerSasPermission().setReadPermission(true).setWritePermission(true)
)
  .setContainerName(containerName)

// 生成服务SAS令牌
val sasToken = sharedKeyCredential.generateSas(sasParams)
println(s"服务SAS令牌:$sasToken")

关键注意事项

  • 用户委托SAS基于Azure AD身份认证,安全性更高,推荐优先采用。
  • 使用存储密钥生成SAS时,必须通过Key Vault管理密钥,杜绝代码硬编码密钥的行为。
  • 生成SAS时,需根据实际业务需求配置最小必要权限(如仅读、读写等)和合理的过期时间,遵循权限最小化原则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 11:27:10