C# WIF:“;ID1014:签名无效。数据可能已被篡改;使用非存储证书时出错

C# WIF:“;ID1014:签名无效。数据可能已被篡改;使用非存储证书时出错,c#,wif,C#,Wif,在开发基于声明的身份验证应用程序时,为了使该应用程序在部署到负载平衡服务器时能够工作,我使用RSATokentTransform处理程序替换默认的SecurityTokenHandler,使用自备证书加密会话cookie: X509Certificate2 serviceCertificate = new X509Certificate2(certificate, certificatePassword); List<CookieTransform> sessionTransform

在开发基于声明的身份验证应用程序时,为了使该应用程序在部署到负载平衡服务器时能够工作,我使用RSATokentTransform处理程序替换默认的SecurityTokenHandler,使用自备证书加密会话cookie:

X509Certificate2 serviceCertificate = new X509Certificate2(certificate, certificatePassword);
List<CookieTransform> sessionTransformers =
    new List<CookieTransform>
    (
            new CookieTransform[]
        {
            new DeflateCookieTransform(),
            new RsaEncryptionCookieTransform(serviceCertificate),
            new RsaSignatureCookieTransform(serviceCertificate)
        }
    );
SessionSecurityTokenHandler sessionHandler = new SessionSecurityTokenHandler(sessionTransformers.AsReadOnly());

FederatedAuthentication.ServiceConfiguration.SecurityTokenHandlers.AddOrReplace(sessionHandler);
X509Certificate2服务证书=新的X509Certificate2(证书,证书密码);
列出会话转换器=
新名单
(
新CookieTransform[]
{
新的deflateCookietTransform(),
新的RSA加密CookieTransform(服务证书),
新RsaSignatureCookieTransform(服务证书)
}
);
SessionSecurityTokenHandler sessionHandler=新建SessionSecurityTokenHandler(sessionTransformers.AsReadOnly());
FederatedAuthentication.ServiceConfiguration.SecurityTokenHandlers.AddOrReplace(sessionHandler);
为了使应用程序更加灵活和可移植,从数据库中提取证书,并在运行时将其存储在X509Certificate2对象中

这适用于托管应用程序的一台服务器,但一旦我切换到服务器场,不时会出现以下错误:

ID1014:签名无效。数据可能已被篡改

由于同样的问题,一些javascript、css和字体文件无法加载

相关问题,但未解决问题:


在互联网上搜索后,我没有找到关于这个问题的明确解释或解决方案;为了节省可能遇到与我相同问题的人的时间,以下是解释:

问题的原因是,默认情况下,X509Certificate2对象只提供临时私钥提供程序,该提供程序不会在服务器场中的不同服务器之间持久存在。一旦请求从原始服务器转到另一个服务器,Privatekey提供程序在该服务器上变为空(因为它不会持久存在),因此引发异常,因为签名验证需要证书的私钥

要解决此问题,只需在创建X509Certificate2对象时使Privatekey提供程序持久化:

X509Certificate2 serviceCertificate = new X509Certificate2(certificate, certificatePassword, X509KeyStorageFlags.MachineKeySet|X509KeyStorageFlags.PersistKeySet);

在互联网上搜索后,我没有找到关于这个问题的明确解释或解决方案;为了节省可能遇到与我相同问题的人的时间,以下是解释:

问题的原因是,默认情况下,X509Certificate2对象只提供临时私钥提供程序,该提供程序不会在服务器场中的不同服务器之间持久存在。一旦请求从原始服务器转到另一个服务器,Privatekey提供程序在该服务器上变为空(因为它不会持久存在),因此引发异常,因为签名验证需要证书的私钥

要解决此问题,只需在创建X509Certificate2对象时使Privatekey提供程序持久化:

X509Certificate2 serviceCertificate = new X509Certificate2(certificate, certificatePassword, X509KeyStorageFlags.MachineKeySet|X509KeyStorageFlags.PersistKeySet);