使用.NET客户端库通过用户委托SAS令牌复制Azure Blob遇授权错误
Azure Blob容器间复制:用户委托SAS授权错误排查
问题描述
将Azure Storage Blob中的文件从stageContainer复制到targetContainer时,使用普通SAS令牌可正常完成复制,但使用用户委托SAS令牌时触发授权错误。
代码问题分析
你的代码核心错误在于生成了带用户委托SAS的Blob URI,但实际复制时仍使用未携带SAS的原始Blob URI:
- 代码通过
blobUriBuilder.ToUri()生成了带SAS的源Blob URI,但未将其赋值给变量并传入StartCopyFromUri方法; - 最终调用
targetBlobClient.StartCopyFromUri(stageBlobClient.Uri)时,传入的是未授权的原始URI,直接触发授权错误。
另外还有两处细节问题:
- 获取用户委托密钥时,
Start参数传null,建议显式设置为当前时间DateTimeOffset.UtcNow,避免潜在的时间范围异常; - 用户委托密钥过期时间设为5分钟后,但SAS令牌过期时间设为1天后,会导致SAS有效期超过密钥有效期,触发无效授权,两者有效期需保持一致或SAS过期时间不晚于密钥过期时间。
修正后的代码
public void copyblob3(string fileName) { var stageContainer = "stageContainer"; var targetContainer = "targetContainer"; var storage = "storageAccountName"; var url = @"https://" + storage + ".blob.core.windows.net"; blobServiceClient = new BlobServiceClient( new Uri(url), new DefaultAzureCredential()); BlobContainerClient stageContainerClient = blobServiceClient.GetBlobContainerClient(stageContainer); BlobContainerClient targetContainerClient = blobServiceClient.GetBlobContainerClient(targetContainer); var targetBlobClient = targetContainerClient.GetBlobClient(fileName); DateTimeOffset currentTime = DateTimeOffset.UtcNow; DateTimeOffset expiryTime = currentTime.AddMinutes(5); // 统一有效期为5分钟 // 获取用户委托密钥,显式设置起始时间 var userDelegationKey = blobServiceClient.GetUserDelegationKey(currentTime, expiryTime, CancellationToken.None); var sasBuilder = new BlobSasBuilder() { BlobContainerName = stageContainer, BlobName = fileName, Resource = "b", ExpiresOn = expiryTime, // SAS过期时间与密钥保持一致 }; sasBuilder.SetPermissions(BlobSasPermissions.Read); BlobClient stageBlobClient = stageContainerClient.GetBlobClient(fileName); var blobUriBuilder = new BlobUriBuilder(stageBlobClient.Uri) { Sas = sasBuilder.ToSasQueryParameters(userDelegationKey, storage) // 传入存储账户名而非容器名 }; var sasUri = blobUriBuilder.ToUri(); // 保存带SAS的授权URI // 使用带用户委托SAS的URI发起复制 var result = targetBlobClient.StartCopyFromUri(sasUri); }
关键修正点说明
- 使用授权URI:将生成的
sasUri传入StartCopyFromUri,确保源Blob请求携带有效用户委托SAS授权; - 统一有效期:用户委托密钥和SAS令牌的过期时间保持一致,避免因密钥提前失效导致SAS无效;
- 修正SAS参数:调用
ToSasQueryParameters时,第二个参数需传入存储账户名,而非容器名,这是用户委托SAS的必填要求。
内容的提问来源于stack exchange,提问作者Jashvita
相关产品推荐
相关产品推荐

