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

使用Node.js完成文件上传后如何撤销Azure共享访问签名(SAS)

SAS令牌撤销实现方案

Azure存储不存在单独撤销某一张SAS令牌的原生API,你当前使用的是用户委托SAS,可根据业务场景选择以下方案实现失效控制:

方案1:直接撤销用户委托密钥(适配你当前的代码逻辑)

用户委托SAS是通过用户委托密钥签发的,调用revokeUserDelegationKeys方法后,所有在入参时间点之前签发的用户委托密钥生成的SAS都会立即失效,适合单一场景下没有其他在用用户委托SAS的情况。
示例代码:

// 上传完成后调用,撤销当前时间前所有用户委托密钥签发的SAS
await this.blobServiceClient.revokeUserDelegationKeys(new Date());

注意:该操作会影响同存储账户下所有对应时间段生成的用户委托SAS,多业务共用存储账户时谨慎使用。

方案2:改用绑定存储访问策略的服务SAS(推荐频繁撤销场景)

你可以提前在容器上创建存储访问策略,生成SAS时绑定该策略,后续只需要删除/修改对应策略即可立即让所有绑定该策略的SAS失效,支持按业务维度隔离控制。
生成绑定策略的SAS示例:

// 第一步:提前在容器上创建存储访问策略
const containerClient = blobServiceClient.getContainerClient(containerName);
const accessPolicy = {
  id: 'upload-policy-001', // 策略唯一标识
  accessPolicy: {
    permissions: BlobSASPermissions.parse('racwd').toString(),
    startsOn: new Date(),
    expiresOn: new Date(new Date().valueOf() + 60 * 60 * 1000)
  }
};
await containerClient.setAccessPolicy(undefined, [accessPolicy]);

// 第二步:生成绑定该策略的SAS
const queryParams = generateBlobSASQueryParameters({
  containerName,
  identifier: 'upload-policy-001' // 绑定策略ID,不需要单独传权限、有效期
}, storageAccountSharedKey, storageAccount); // 用账户密钥签发服务SAS

需要撤销时直接删除对应策略即可:

// 移除对应ID的策略,所有绑定该策略的SAS立即失效
await containerClient.setAccessPolicy(undefined, []);

方案3:业务层自定义失效控制(无存储侧改动)

生成SAS时将SAS的签名字段、对应的Blob路径、失效状态存入你的业务数据库,上传完成后标记该SAS为失效,后续所有使用该SAS的请求先经过你的业务服务校验状态,标记为失效的直接拒绝访问。

方案4:Blob维度加锁(针对单Blob SAS场景)

如果你生成的是单Blob维度的SAS,上传完成后可以为该Blob添加永久租约,没有租约密钥的请求即使持有有效SAS也无法修改/覆盖该Blob,间接实现上传权限回收:

// 上传完成后为Blob加永久租约
const blockBlobClient = containerClient.getBlockBlobClient(blobName);
const leaseResponse = await blockBlobClient.acquireLease(-1); // -1代表永久租约
// 后续需要修改Blob时需要携带leaseResponse.leaseId才能操作

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 04:27:02