C#使用Azure Key Vault解密下载加密Azure Blob出现Forbidden错误
错误产生原因
- 授权身份不匹配:你在Key Vault中配置权限的安全主体,和代码中
GetToken方法获取Token对应的身份(服务主体、托管标识、本地开发账号等)不是同一个主体,导致访问被拒绝。 - 缺少
Unwrap Key操作权限:加密Blob时仅需要密钥的Wrap Key权限,解密时需要调用Unwrap Key接口解包数据加密密钥,即使你勾选了全部权限也可能存在权限未生效、或者使用Azure RBAC模式时分配的角色不包含Unwrap Key操作权限的情况。 - Key Vault网络访问限制:Key Vault开启了防火墙规则,你当前运行代码的客户端IP、或者代码部署的虚拟网络不在Key Vault的允许访问列表中,触发403拒绝。
- 密钥状态异常:你使用的密钥已被禁用、已过有效期,或者加密时使用的密钥版本已被删除,无法执行解密操作。
解决方案
- 核对授权身份:首先确认代码
GetToken方法获取的身份标识,和Key Vault访问策略(或Azure RBAC角色)中分配权限的主体完全一致,避免错给其他账号/服务主体授权。 - 补全解密权限:
- 如果你使用Key Vault访问策略模式:找到对应授权主体的密钥权限,确认已勾选
Unwrap Key权限,保存配置后等待3-5分钟生效再重试。 - 如果你使用Azure RBAC权限模式:给对应身份分配Key Vault加密用户角色,该角色默认包含加解密所需的Wrap/Unwrap密钥权限。
- 如果你使用Key Vault访问策略模式:找到对应授权主体的密钥权限,确认已勾选
- 排查网络限制:临时将Key Vault的网络访问设置调整为允许所有网络访问,测试解密是否正常。如果测试通过,再将你运行代码的公网IP、或部署环境所在的虚拟网络子网添加到Key Vault的允许访问列表即可。
- 确认密钥状态:进入Key Vault密钥管理页面,确认你使用的密钥处于启用状态,没有过期,且加密时使用的密钥版本仍存在未被删除。
另外你代码中通过ResolveKeyAsync获取的drsa对象并未实际使用,属于冗余代码,不影响解密逻辑,可直接删除。
内容的提问来源于stack exchange,提问作者Atul Takekar
相关产品推荐
相关产品推荐

