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

使用.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,直接触发授权错误。

另外还有两处细节问题:

  1. 获取用户委托密钥时,Start参数传null,建议显式设置为当前时间DateTimeOffset.UtcNow,避免潜在的时间范围异常;
  2. 用户委托密钥过期时间设为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 21:24:53