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

Azure Blob读取SAS令牌抛出AuthorizationPermissionMismatch异常排查

生成Blob的SAS令牌后读取报错403,已设置Read权限仍提示权限不匹配

我尝试为Blob生成SAS令牌,让持有令牌的用户可以读取该Blob。以下是我的代码,但读取Blob时抛出异常。如果给用户授予「Storage Blob Data Reader」权限就能正常工作。我原本以为持有SAS令牌的用户不需要特定权限就能读取Blob,请问我哪里漏了?

BlobServiceClient blobServiceClient = new BlobServiceClient(new Uri("https://accountname.blob.core.windows.net/"), new DefaultAzureCredential());
UserDelegationKey key = await blobServiceClient.GetUserDelegationKeyAsync(DateTimeOffset.UtcNow,
                                                           DateTimeOffset.UtcNow.AddDays(1));
BlobSasBuilder sasBuilder = new BlobSasBuilder()
{
    BlobContainerName = "containerName",
    BlobName = "file.json",
    Resource = "b",
    StartsOn = DateTimeOffset.UtcNow,
    ExpiresOn = DateTimeOffset.UtcNow.AddHours(1)
};

sasBuilder.SetPermissions(BlobSasPermissions.Read);
string sasToken = sasBuilder.ToSasQueryParameters(key, "accountname").ToString();
UriBuilder fullUri = new UriBuilder()
{
    Scheme = "https",
    Host = string.Format("{0}.blob.core.windows.net", "accountname"),
    Path = string.Format("{0}/{1}", "containerName", "file.json"),
    Query = sasToken
};

var blobClient = new Azure.Storage.Blobs.BlobClient(fullUri.Uri);

using (var stream = await blobClient.OpenReadAsync())  // throws exception 
{ }

异常信息:

Service request failed.
Status: 403 (This request is not authorized to perform this operation using this permission.)
ErrorCode: AuthorizationPermissionMismatch

问题原因与解决方法
  • 生成用户委派SAS的身份权限不足
    你代码中生成的是用户委派SAS令牌,这类SAS的有效性依赖于生成它的身份(即DefaultAzureCredential对应的实体,比如当前登录用户、服务主体等)必须具备生成用户委派密钥的权限。具体需要:

    • 拥有Microsoft.Storage/storageAccounts/blobServices/generateUserDelegationKey/action权限
    • 或者分配包含该权限的内置角色,比如「Storage Blob Data Contributor」「Storage Blob Data Owner」——「Storage Blob Data Reader」角色本身不包含生成密钥的权限,你之前加这个角色后能工作,是因为此时生成SAS的身份同时获得了读取Blob和生成密钥的权限(可能是角色叠加或其他配置)。
  • 关于SAS权限的误解澄清
    持有SAS令牌的用户确实不需要额外权限就能读取Blob,但生成用户委派SAS的那个身份必须有权限创建该令牌,这是你忽略的关键点。

  • 两种解决路径

    1. 给生成SAS的身份分配包含generateUserDelegationKey权限的角色,确保它能正常生成用户委派密钥。
    2. 若无需基于Azure AD的用户委派SAS,可改用账户SAS或服务SAS:这类SAS基于存储账户密钥生成,不需要调用GetUserDelegationKeyAsync,只要账户密钥有效且SAS配置了Read权限即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 03:45:33