如何修改AzureBlobService代码以通过SAS令牌连接Azure CDN文件夹
如何通过SAS令牌修改AzureBlobService连接Azure CDN文件夹?
原代码
using Azure.Storage.Blobs; using Azure.Storage.Blobs.Models; namespace AzureBlob.API.Service { public class AzureBlobService { BlobServiceClient _blobClient; BlobContainerClient _containerClient; string azureConnectionString = "<Primary Connection String>"; public AzureBlobService() { _blobClient = new BlobServiceClient(azureConnectionString); _containerClient = _blobClient.GetBlobContainerClient("apiimages"); } public async Task<List<Azure.Response<BlobContentInfo>>> UploadFiles(List<IFormFile> files) { var azureResponse = new List<Azure.Response<BlobContentInfo>>(); foreach (var file in files) { string fileName = file.FileName; using (var memoryStream = new MemoryStream()) { file.CopyTo(memoryStream); memoryStream.Position = 0; var client = await _containerClient.UploadBlobAsync(fileName, memoryStream, default); azureResponse.Add(client); } }; return azureResponse; } public async Task<List<BlobItem>> GetUploadedBlobs() { var items = new List<BlobItem>(); var uploadedFiles = _containerClient.GetBlobsAsync(); await foreach (BlobItem file in uploadedFiles) { items.Add(file); } return items; } } }
修改方案
要通过SAS令牌连接,核心是直接使用包含SAS令牌的容器URL初始化BlobContainerClient,不再依赖存储账户连接字符串。具体修改如下:
- 移除BlobServiceClient依赖:SAS令牌是针对特定容器(或Blob)的授权凭证,不需要通过BlobServiceClient中转,直接操作BlobContainerClient即可。
- 替换初始化逻辑:用容器URL(格式如
https://<存储账户名>.blob.core.windows.net/<容器名>?<SAS令牌>)来创建BlobContainerClient。 - 优化配置方式:建议从配置文件读取容器URL和SAS令牌,避免硬编码,提升安全性和灵活性。
修改后的完整代码
using Azure.Storage.Blobs; using Azure.Storage.Blobs.Models; using Microsoft.AspNetCore.Http; namespace AzureBlob.API.Service { public class AzureBlobService { private readonly BlobContainerClient _containerClient; // 推荐从配置注入容器URL(含SAS令牌),而非硬编码 public AzureBlobService(string containerSasUrl) { // 直接用包含SAS令牌的容器URL初始化客户端 _containerClient = new BlobContainerClient(new Uri(containerSasUrl)); } public async Task<List<Azure.Response<BlobContentInfo>>> UploadFiles(List<IFormFile> files) { var azureResponse = new List<Azure.Response<BlobContentInfo>>(); foreach (var file in files) { string fileName = file.FileName; using (var memoryStream = new MemoryStream()) { await file.CopyToAsync(memoryStream); memoryStream.Position = 0; var response = await _containerClient.UploadBlobAsync(fileName, memoryStream, default); azureResponse.Add(response); } } return azureResponse; } public async Task<List<BlobItem>> GetUploadedBlobs() { var items = new List<BlobItem>(); await foreach (BlobItem blob in _containerClient.GetBlobsAsync()) { items.Add(blob); } return items; } } }
关键注意事项
- SAS令牌权限:确保你的SAS令牌包含所需权限:
- 上传文件需要
Write或Create权限 - 列出Blob需要
List权限
- 上传文件需要
- 容器URL格式:必须是完整的容器地址加上SAS令牌,示例:
https://mystorageaccount.blob.core.windows.net/apiimages?sv=2023-11-03&ss=b&srt=c&sp=rwl&se=2024-12-31T23:59:59Z&st=2024-01-01T00:00:00Z&spr=https&sig=xxxxxx - 配置注入:在实际项目中,建议通过
appsettings.json存储容器SAS URL,然后依赖注入到服务中,避免硬编码敏感信息。
内容的提问来源于stack exchange,提问作者Destroyer_12321
相关产品推荐
相关产品推荐

