.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.BlobsNuget包,用12.x以上的稳定版即可,和你之前用连接字符串时的版本保持一致就行
内容的提问来源于stack exchange,提问作者Codehelp
相关产品推荐
相关产品推荐

