Azure函数开发:如何正确使用C#生成Blob用户委托SAS Token的函数?
如何使用Azure Blob存储的用户委托SAS Token生成函数
问题背景
我是C#新手,正在开发一个用于生成Blob存储SAS Token及其他任务的Azure函数。从微软文档找到一段生成SAS Token的代码,但不清楚正确用法:
- 不知道该传入的BlobClient对象如何获取
- 不知道该从何处调用此函数(如Main方法还是其他位置)
- 不知道如何使用该函数的返回值
参考代码
async static Task<Uri> GetUserDelegationSasBlob(BlobClient blobClient) { BlobServiceClient blobServiceClient = blobClient.GetParentBlobContainerClient().GetParentBlobServiceClient(); // 获取用户委托密钥 Azure.Storage.Blobs.Models.UserDelegationKey userDelegationKey = await blobServiceClient.GetUserDelegationKeyAsync(DateTimeOffset.UtcNow, DateTimeOffset.UtcNow.AddDays(7)); // 创建有效期7天的SAS Token BlobSasBuilder sasBuilder = new BlobSasBuilder() { BlobContainerName = blobClient.BlobContainerName, BlobName = blobClient.Name, Resource = "b", // 表示资源是Blob("c"表示容器) StartsOn = DateTimeOffset.UtcNow, ExpiresOn = DateTimeOffset.UtcNow.AddDays(7) }; // 指定SAS的读写权限 sasBuilder.SetPermissions(BlobSasPermissions.Read | BlobSasPermissions.Write); // 将SAS Token附加到Blob URI上 BlobUriBuilder blobUriBuilder = new BlobUriBuilder(blobClient.Uri) { Sas = sasBuilder.ToSasQueryParameters(userDelegationKey, blobServiceClient.AccountName) }; Console.WriteLine("Blob用户委托SAS URI: {0}", blobUriBuilder); Console.WriteLine(); return blobUriBuilder.ToUri(); }
1. 如何获取BlobClient对象
要生成Blob的SAS Token,首先得拿到对应Blob的BlobClient实例,步骤如下:
- 从Azure门户获取你的存储账户连接字符串(新手推荐先从连接字符串入手,不要硬编码,优先从环境变量或配置文件读取)
- 通过连接字符串创建
BlobServiceClient,再逐级获取容器和Blob的客户端
示例代码:
// 从环境变量读取连接字符串 string connectionString = Environment.GetEnvironmentVariable("AzureStorageConnectionString"); BlobServiceClient serviceClient = new BlobServiceClient(connectionString); // 指定目标容器名称和Blob名称 string containerName = "your-container-name"; string blobName = "target-blob.txt"; // 获取BlobClient BlobContainerClient containerClient = serviceClient.GetBlobContainerClient(containerName); BlobClient blobClient = containerClient.GetBlobClient(blobName);
注意:你的身份(不管是连接字符串对应的账户,还是Azure函数的托管身份)需要拥有
Microsoft.Storage/storageAccounts/blobServices/generateUserDelegationKey/action权限,否则无法获取用户委托密钥。
2. 函数的调用位置
在Azure函数中调用
如果是开发Azure函数(比如HTTP触发),直接在你的函数触发方法里调用即可:
public class SasGeneratorFunction { [FunctionName("GenerateBlobSas")] public async Task<IActionResult> Run( [HttpTrigger(AuthorizationLevel.Function, "get", Route = null)] HttpRequest req, ILogger log) { log.LogInformation("开始生成Blob SAS Token"); // 步骤1:获取BlobClient string connectionString = Environment.GetEnvironmentVariable("AzureStorageConnectionString"); BlobServiceClient serviceClient = new BlobServiceClient(connectionString); BlobContainerClient containerClient = serviceClient.GetBlobContainerClient("test-container"); BlobClient blobClient = containerClient.GetBlobClient("sample.txt"); // 步骤2:调用生成SAS的函数 Uri sasUri = await GetUserDelegationSasBlob(blobClient); // 步骤3:返回结果给调用方 return new OkObjectResult(new { SasUri = sasUri.ToString() }); } // 把你提供的GetUserDelegationSasBlob函数放在这里 async static Task<Uri> GetUserDelegationSasBlob(BlobClient blobClient) { // 原代码内容... } }
在控制台程序中调用
如果是测试用的控制台程序,需要把Main方法改成异步,然后直接调用:
static async Task Main(string[] args) { // 获取BlobClient string connectionString = "你的存储账户连接字符串"; BlobServiceClient serviceClient = new BlobServiceClient(connectionString); BlobContainerClient containerClient = serviceClient.GetBlobContainerClient("test-container"); BlobClient blobClient = containerClient.GetBlobClient("sample.txt"); // 调用生成SAS的函数 Uri sasUri = await GetUserDelegationSasBlob(blobClient); Console.WriteLine("生成的SAS URI: " + sasUri); }
3. 函数返回值的使用
函数返回的是带有SAS Token的完整Blob URI,用法很灵活:
- 可以直接返回给前端,让前端用这个URI直接下载、上传或修改Blob(不需要额外的身份验证)
- 可以在后端代码中用这个URI创建新的
BlobClient,进行Blob操作:
Uri sasUri = await GetUserDelegationSasBlob(blobClient); // 用SAS授权的Uri创建BlobClient BlobClient sasAuthorizedClient = new BlobClient(sasUri); // 示例:读取Blob内容 var downloadResult = await sasAuthorizedClient.DownloadContentAsync(); string blobContent = downloadResult.Value.Content.ToString(); Console.WriteLine("Blob内容: " + blobContent); // 示例:上传内容到Blob await sasAuthorizedClient.UploadAsync(BinaryData.FromString("新的Blob内容"), overwrite: true);
内容的提问来源于stack exchange,提问作者Jeanpaul
相关产品推荐
相关产品推荐

