使用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
相关产品推荐
相关产品推荐

