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

.Net Core Web API如何使用SAS实现Azure BLOB Storage基础操作

.NET Core 基于SAS鉴权对接Azure Blob Storage 实现方案

你之前基于连接字符串写的上传、下载、删除逻辑几乎不用改,核心是替换BlobContainerClient/BlobClient的初始化方式,用SAS凭证替代连接字符串即可,以下是可直接复用的实现代码。

前置说明

SAS鉴权分两种常见场景,根据你拿到的SAS类型选对应初始化方式即可:

  • 场景1:管理员直接给你分配好对应容器权限的SAS URI(你当前的需求场景,不需要存储账户密钥)
  • 场景2:你持有存储账户密钥,需要后端自行生成SAS用于后续操作(一般管理端场景用)

核心客户端初始化

场景1:直接使用现成SAS URI初始化(无密钥场景)

// 从配置文件读取SAS URI,不要硬编码
// URI格式:https://<存储账户名>.blob.core.windows.net/<容器名>?<SAS签名参数串>
string containerSasUri = builder.Configuration.GetValue<string>("AzureBlob:SasUri");
BlobContainerClient containerClient = new BlobContainerClient(new Uri(containerSasUri));

初始化完成后,这个containerClient的所有用法和你之前用连接字符串初始化的客户端完全一致,后续业务代码不需要做任何修改。

场景2:自行生成SAS(需存储账户密钥)

如果需要后端动态生成SAS,用以下代码构造:

string accountName = builder.Configuration.GetValue<string>("AzureBlob:AccountName");
string accountKey = builder.Configuration.GetValue<string>("AzureBlob:AccountKey");
string containerName = builder.Configuration.GetValue<string>("AzureBlob:ContainerName");
StorageSharedKeyCredential credential = new StorageSharedKeyCredential(accountName, accountKey);
BlobContainerClient baseContainerClient = new BlobContainerClient(
    new Uri($"https://{accountName}.blob.core.windows.net/{containerName}"), 
    credential);
// 配置SAS权限、过期时间,遵循最小权限原则
BlobSasBuilder sasBuilder = new BlobSasBuilder
{
    Resource = "c", // c=容器级SAS,b=单个Blob级SAS
    ExpiresOn = DateTimeOffset.UtcNow.AddHours(2), // 过期时间按业务安全要求设置,不要过长
    Protocol = SasProtocol.Https // 强制HTTPS访问,提升安全性
};
// 按需分配权限:读=下载、写=上传、删除=删除
sasBuilder.SetPermissions(
    BlobContainerSasPermissions.Read | 
    BlobContainerSasPermissions.Write | 
    BlobContainerSasPermissions.Delete);
// 生成带SAS的客户端
BlobContainerClient containerClient = new BlobContainerClient(baseContainerClient.GenerateSasUri(sasBuilder));

三个核心接口实现

1. 上传接口(基于IFormFile)

[HttpPost("upload")]
public async Task<IActionResult> Upload(IFormFile file)
{
    if (file == null || file.Length == 0)
        return BadRequest("上传文件不能为空");
    
    string blobName = Path.GetFileName(file.FileName);
    BlobClient blobClient = containerClient.GetBlobClient(blobName);
    
    using (Stream stream = file.OpenReadStream())
    {
        // overwrite参数按需设置,true覆盖同名文件,false同名文件存在时报错
        await blobClient.UploadAsync(stream, overwrite: true);
    }
    
    return Ok(new { BlobName = blobName, BlobUrl = blobClient.Uri.AbsoluteUri });
}

2. 下载接口

[HttpGet("download/{blobName}")]
public async Task<IActionResult> Download(string blobName)
{
    BlobClient blobClient = containerClient.GetBlobClient(blobName);
    if (!await blobClient.ExistsAsync())
        return NotFound("指定文件不存在");
    
    BlobDownloadInfo downloadResult = await blobClient.DownloadAsync();
    return File(downloadResult.Content, downloadResult.ContentType, blobName);
}

3. 删除接口

[HttpDelete("delete/{blobName}")]
public async Task<IActionResult> Delete(string blobName)
{
    BlobClient blobClient = containerClient.GetBlobClient(blobName);
    if (!await blobClient.ExistsAsync())
        return NotFound("指定文件不存在");
    
    await blobClient.DeleteAsync();
    return Ok("文件删除成功");
}

注意事项

  • SAS、存储账户密钥必须存在配置中心、环境变量或者appsettings.json等配置文件中,禁止硬编码在业务代码里
  • 如果管理员给的是单个Blob级别的SAS,直接用SAS URI初始化BlobClient即可,不需要走BlobContainerClient
  • SAS权限遵循最小分配原则:只给业务必须的权限,比如仅上传场景就不要分配读、删除权限;过期时间不要设置过长,降低泄露风险
  • 如果SAS配置了IP白名单,需要确保服务部署后的出口IP在白名单范围内,否则会返回403权限错误
  • 确保项目安装了Azure.Storage.Blobs Nuget包,用12.x以上的稳定版即可,和你之前用连接字符串时的版本保持一致就行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 12:45:27