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

如何通过托管标识生成存储账户级别的SAS Token?

生成Azure存储账户级别的用户委托SAS Token(解决403认证失败问题)

问题背景

原有代码可正常生成指定Blob的用户委托SAS Token,但尝试修改为生成存储账户级别SAS时,出现403认证失败错误,错误信息如下:

<?xml version="1.0" encoding="utf-8"?>
<Error>
       <Code>Authentication failed</Code>
       <Message> The server could not authenticate the request. Make sure the authorization header value is correctly formed, including the signature.
Request ID: f100b2a0-501e-0038-06dd-cb612f000000
Time:2023-08-10T22:53:59.3204012Z</Message>
</Error>

问题原因

生成账户级别的用户委托SAS不能使用BlobSasBuilder,该类仅适用于容器或Blob级别的SAS。账户级别SAS需要使用AccountSasBuilder,同时要正确配置服务类型、资源类型和权限参数。

修正后的代码

以下是可生成存储账户级别用户委托SAS Token的完整代码:

[HttpGet]
public IActionResult GetAccountLevelSasToken()
{
    var storageAccountName = "storage-Name";
    var saUri = $"https://{storageAccountName}.blob.core.windows.net";

    // 使用Azure AD凭据创建Blob服务客户端
    var blobServiceClient = new BlobServiceClient(new Uri(saUri), new DefaultAzureCredential());

    // 获取有效期2小时的用户委托密钥
    var userDelegationKey = blobServiceClient.GetUserDelegationKey(
        DateTimeOffset.UtcNow,
        DateTimeOffset.UtcNow.AddHours(2));

    // 初始化账户SAS构建器
    var accountSasBuilder = new AccountSasBuilder()
    {
        // 指定服务类型:仅Blob服务
        Services = AccountSasServices.Blobs,
        // 指定可访问的资源类型:容器和Blob
        ResourceTypes = AccountSasResourceTypes.Container | AccountSasResourceTypes.Object,
        // SAS生效时间
        StartsOn = DateTimeOffset.UtcNow,
        // SAS过期时间
        ExpiresOn = DateTimeOffset.UtcNow.AddHours(2),
        // 指定账户级别SAS的权限:此处设置为读取
        Permissions = AccountSasPermissions.Read
    };

    // 生成SAS查询参数
    var sasToken = accountSasBuilder.ToSasQueryParameters(userDelegationKey, storageAccountName).ToString();

    // 拼接存储账户URL和SAS Token
    var accountUrlWithSas = $"{saUri}?{sasToken}";

    return Ok(new { AccountUrlWithSas = accountUrlWithSas });
}

关键说明

  • AccountSasBuilder:专门用于构建账户级别的SAS Token,需配置Services(指定生效的存储服务,这里只选Blob)、ResourceTypes(指定可访问的资源层级,容器和对象)和Permissions(账户级别的权限集合)。
  • 用户委托密钥:依然使用GetUserDelegationKey获取,该密钥用于签署账户级别的用户委托SAS。
  • URL格式:生成的账户级别SAS URL格式为https://{storageAccountName}.blob.core.windows.net?{SasToken},可用于访问该存储账户下Blob服务的所有容器和Blob(受权限限制)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 23:17:36