Azure VM中Web应用启用Windows认证后Key Vault密钥集不存在问题
解决Azure Key Vault集成后IIS启用Windows认证时的"Keyset does not exist"错误
这个错误我之前帮别人排查过好几次,核心原因都是权限不匹配:当你禁用匿名、启用Windows认证后,你的ASP.NET应用不再以匿名用户身份运行,而是会使用IIS应用池的身份(默认是ApplicationPoolIdentity)或者你指定的域用户身份,这个身份没有足够的权限访问加密密钥容器,或者没有Azure Key Vault的访问权限,从而抛出System.Security.Cryptography.CryptographicException。
下面分场景给出具体的解决步骤:
场景1:错误来自本地加密密钥容器
如果你的应用使用了本地RSA密钥容器(比如用来加密/解密存储在Key Vault中的敏感数据),那需要给应用池身份授予该容器的访问权限:
- 以管理员身份打开命令提示符,运行以下命令列出所有已注册的密钥容器:
aspnet_regiis -lk - 在输出中找到你的应用使用的密钥容器名称(通常和你的应用程序名或配置中的名称对应)。
- 运行以下命令给应用池身份授予权限,替换占位符为你的实际信息:
aspnet_regiis -pa "你的密钥容器名称" "IIS APPPOOL\你的应用池名称" - 重启IIS应用池和对应的网站,再测试是否解决问题。
场景2:错误来自Azure Key Vault访问权限不足
如果问题出在访问Key Vault的时候,需要确保应用运行的身份有Key Vault的访问权限:
- 登录Azure门户,找到你的Key Vault资源。
- 进入访问策略页面,点击添加访问策略。
- 在主体搜索框中,查找并选择你的应用运行身份:
- 如果用的是默认的
ApplicationPoolIdentity,建议给应用池启用系统托管身份,然后搜索这个托管身份的名称; - 如果是自定义域用户身份,直接搜索该用户的名称即可。
- 如果用的是默认的
- 勾选所需的权限(比如密钥的
Get、List权限,根据你的应用需求选择),点击添加并保存更改。 - 确保你的应用代码中是使用托管身份或正确的凭据方式访问Key Vault,而不是硬编码的过时凭据。
场景3:切换应用池身份为具有完整权限的用户
如果上面的方法都没效果,可以尝试将应用池的身份改为一个同时拥有以下权限的域用户:
- 本地加密密钥容器的访问权限;
- Azure Key Vault的访问权限。
操作步骤:
- 打开IIS管理器,找到你的应用池,右键选择高级设置。
- 在标识选项中,选择自定义账户,点击设置,输入有对应权限的域用户名和密码。
- 重启应用池,刷新网站测试。
额外排查技巧
- 仔细查看堆栈跟踪的最底层,确认错误是发生在本地加密操作还是Azure Key Vault的调用环节,这能帮你快速缩小排查范围;
- 在Azure门户的Key Vault日志页面启用日志记录,查看是否有访问被拒绝的具体记录,里面会明确指出哪个身份没有权限。
内容的提问来源于stack exchange,提问作者swetha g
相关产品推荐
相关产品推荐

