如何用C#通过账户密钥获取Blob存储SAS令牌并改写代码
基于账户密钥生成Blob存储SAS令牌(C#实现)
需求说明
需要在C#中通过账户密钥生成具备读、写、删除等完整权限的Blob存储SAS令牌,替代原本基于用户委托(User Delegation)的实现方案,且无法使用用户委托方式。
实现代码
public async Task<string> GetBlobSASToken(string containerName) { _logger.LogInformation($"Initial Load Worker called Blob SAS Token creation."); try { DbConnectionStringBuilder dbConnectionStringBuilder = new DbConnectionStringBuilder(); dbConnectionStringBuilder.ConnectionString = _config.BlobStorageConnectionString; var azureStorageAccount = dbConnectionStringBuilder["AccountName"].ToString(); var azureStorageAccessKey = dbConnectionStringBuilder["AccountKey"].ToString(); Azure.Storage.Sas.BlobSasBuilder blobSasBuilder = new Azure.Storage.Sas.BlobSasBuilder() { BlobContainerName = containerName, Protocol = SasProtocol.Https, // 仅允许HTTPS访问,提升安全性 Resource = "c", // 指定为容器级SAS("c"代表container) StartsOn = DateTimeOffset.UtcNow.AddDays(-1), // 提前1天生效,避免时区同步问题 ExpiresOn = DateTimeOffset.UtcNow.AddDays(3), // SAS令牌3天后过期 }; // 配置容器级SAS的全量操作权限 blobSasBuilder.SetPermissions( Azure.Storage.Sas.BlobSasPermissions.Read | Azure.Storage.Sas.BlobSasPermissions.Add | Azure.Storage.Sas.BlobSasPermissions.Create | Azure.Storage.Sas.BlobSasPermissions.Write | Azure.Storage.Sas.BlobSasPermissions.Delete | Azure.Storage.Sas.BlobSasPermissions.List | Azure.Storage.Sas.BlobSasPermissions.SetImmutabilityPolicy ); // 使用账户密钥生成SAS令牌 var sasToken = blobSasBuilder.ToSasQueryParameters(new StorageSharedKeyCredential(azureStorageAccount, azureStorageAccessKey)).ToString(); return sasToken; } catch (Exception ex) { _logger.LogError(ex, $"Initial Load Worker has error when creating a SAS token for Initial Load Worker."); throw; } }
关键说明
- 账户信息解析:通过
DbConnectionStringBuilder自动从存储连接字符串中提取账户名和密钥,避免手动拆分字符串的出错风险。 - SAS参数配置:
Resource = "c":生成容器级SAS,可对目标容器内的所有Blob执行权限范围内的操作;若需生成单个Blob的SAS,可改为Resource = "b"并添加BlobName属性。- 时间范围设置:
StartsOn提前1天生效是为了规避客户端与服务器的时间同步误差,确保令牌能及时使用。
- 权限控制:按需组合
BlobSasPermissions枚举值,可根据业务需求增减权限项,最小化权限范围以提升安全性。
内容的提问来源于stack exchange,提问作者Chaka
相关产品推荐
相关产品推荐

