我有一个Identity Server
托管在 Azure 上的 Web 应用程序。它的根目录中有一个.pfx
文件用于签名。问题是,当新发布时它工作得很好,但过了一段时间它开始抛出CryptographicException: Keyset does not exist.
基于CryptographicException KeySet 不存在,我认为这是一个文件访问问题,但为什么突然天蓝色会弄乱文件访问。
我有一个Identity Server
托管在 Azure 上的 Web 应用程序。它的根目录中有一个.pfx
文件用于签名。问题是,当新发布时它工作得很好,但过了一段时间它开始抛出CryptographicException: Keyset does not exist.
基于CryptographicException KeySet 不存在,我认为这是一个文件访问问题,但为什么突然天蓝色会弄乱文件访问。
我偶尔会看到同样的异常。就我而言,这是由于我在部署槽之间交换时数据保护密钥发生变化引起的。使用services.AddDataProtection()
默认配置并在 Azure 应用服务上托管应用时,数据保护密钥存储在%HOME%\ASP.NET\DataProtection-keys
. 此目录由网络共享支持,以确保密钥在您的所有应用程序实例上都可用,但部署槽并非如此。因此,当您从一个部署槽切换到另一个部署槽时,密钥将发生变化,您将看到CryptographicException: Keyset does not exist
您的应用何时尝试取消对有效负载的保护。
为确保您的应用始终使用相同的密钥,您需要配置不同的密钥存储提供程序。即使用 Redis 或 Azure Blob 存储作为后备存储。
您可以在官方文档中找到有关如何配置它的更多信息。
我还在我的博客上描述了我遇到的问题。
我建议您不要先从磁盘中检索您的签名证书。而是将证书上传到 Azure 门户中的关联 Web 应用程序。
并在应用程序启动时检索证书
就像是。
X509Certificate2 Certificate = null;
var certStore = new X509Store(StoreName.My, StoreLocation.CurrentUser);
certStore.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);
var certCollection = certStore.Certificates.Find(X509FindType.FindByThumbprint,"CERTIFICATE_THUMBPRINT_HERE",false);
Certificate = certCollection[0];