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

时间:2013-03-06 16:22:44

标签: wif

我们已经构建了一个基于Windows Identity Foundation的依赖方应用程序。我们按照Vittorio的书中的建议,创建了一组自定义的cookie变换,以使用RSA加密/签署令牌。

private void OnServiceConfigurationCreated( object sender, ServiceConfigurationCreatedEventArgs e )
{
    List<CookieTransform> sessionTransforms = new List<CookieTransform>( new CookieTransform[]
    {
        new DeflateCookieTransform(),
        new RsaEncryptionCookieTransform( e.ServiceConfiguration.ServiceCertificate ),
        new RsaSignatureCookieTransform( e.ServiceConfiguration.ServiceCertificate )
    } );

    SessionSecurityTokenHandler sessionHandler =
        new SessionSecurityTokenHandler( sessionTransforms.AsReadOnly() );

    e.ServiceConfiguration.SecurityTokenHandlers.AddOrReplace( sessionHandler );
}

我们在web.config中配置了一个。

<microsoft.identityModel>
  <service>
    <serviceCertificate>
      <certificateReference x509FindType="FindByThumbprint" findValue="C7FD338059CCB374798923A915BC91B718814A8E" storeLocation="LocalMachine" storeName="TrustedPeople" />
    </serviceCertificate>
  </service>
</microsoft.identityModel>

我知道OnServiceConfigurationCreated中的代码正在执行,因为如果我将垃圾指纹值放入配置文件中,OnServiceConfigurationCreated会抛出异常。

不幸的是,我们经常会在日志中显示以下异常。

System.Security.Cryptography.CryptographicException: ID1014: The signature is not valid. The data may have been tampered with.
at Microsoft.IdentityModel.Web.RsaSignatureCookieTransform.Decode(Byte[] encoded)
at Microsoft.IdentityModel.Tokens.SessionSecurityTokenHandler.ApplyTransforms(Byte[] cookie, Boolean outbound)
at Microsoft.IdentityModel.Tokens.SessionSecurityTokenHandler.ReadToken(XmlReader reader, SecurityTokenResolver tokenResolver)
at Microsoft.IdentityModel.Tokens.SessionSecurityTokenHandler.ReadToken(Byte[] token, SecurityTokenResolver tokenResolver)
at Microsoft.IdentityModel.Web.SessionAuthenticationModule.ReadSessionTokenFromCookie(Byte[] sessionCookie)
at Microsoft.IdentityModel.Web.SessionAuthenticationModule.TryReadSessionTokenFromCookie(SessionSecurityToken& sessionToken)
at Microsoft.IdentityModel.Web.SessionAuthenticationModule.OnAuthenticateRequest(Object sender, EventArgs eventArgs)
at System.Web.HttpApplication.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

我们认为此异常导致系统中出现其他问题,但无法弄清楚它为何会发生。我们有三个Web服务器,我们已经三次检查它们都配置为使用相同的证书指纹,并且证书安装在所有三个服务器上的相同位置。

我们还使用自定义SessionAuthenticationModule来处理滑动会话过期。我认为可能是当代码(下面)重新发布cookie时可能会使用不同的加密/签名方法,但我很确定我已经测试了它,但似乎不是案子。我只是为了充分披露而将其包括在内。

void CustomSessionAuthenticationModule_SessionSecurityTokenReceived( object sender, SessionSecurityTokenReceivedEventArgs e )
{
    DateTime now = DateTime.UtcNow;
    DateTime validFrom = e.SessionToken.ValidFrom;
    DateTime validTo = e.SessionToken.ValidTo;

    double tokenLifetime = (validTo - validFrom).TotalMinutes;

    SessionAuthenticationModule sam = sender as SessionAuthenticationModule;

    if( now < validTo && now > validFrom.AddMinutes( tokenLifetime / 2 ) )
    {
        e.SessionToken = sam.CreateSessionSecurityToken(
            e.SessionToken.ClaimsPrincipal, e.SessionToken.Context,
            now, now.AddMinutes( tokenLifetime ), e.SessionToken.IsPersistent );
        e.ReissueCookie = true;
    }
}

从我们可以告诉我们已经完成了docs / blogs / etc所说的所有内容,但我们仍然得到了这个例外。任何提示/指示/有根据的猜测在这一点上都会有所帮助。

1 个答案:

答案 0 :(得分:0)

您可能想要检查应用程序设置的Cookie数据的总大小。如果您包含大量声明,则Cookie会相应增长,除非您使用会话模式。例如。 Safari对总cookie数据大小有4K限制。如果你打破了这个限制,你就会开始丢失cookie,这可能意味着你会丢失一部分签名的cookie。

作为旁注,如果您可以转到WIF 4.5,则可以选择使用MachineKeySessionSecurityTokenHandler而不是基于证书的cookie加密。