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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 09:35:33