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

9

我一直在使用WIF来认证我们的新网站,STS基于starter-sts实现。

为了使其在我们的负载均衡环境中正常工作,我在global.asax中使用了以下内容来覆盖默认的证书行为。

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);
        }

这个系统一直在正常运行,人们成功地使用它,然而偶尔我们会收到以下警告信息:

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

在事件日志中,所以我打开了 WIF 跟踪并在日志中看到了以下内容。

ID1074:使用 ProtectedData API 加密 cookie 时发生 CryptographicException 异常(有关详细信息,请参见内部异常)。如果您使用的是 IIS 7.5,则可能是由于 Application Pool 上的 loadUserProfile 设置为 false 导致的。

我觉得这可能会让我走向一个黑暗的小巷,因为我认为因为我已经更改了实现方式来使用 RSA,这不应该影响我。

有什么想法可以帮助我吗?


谢谢您的回复,我已经仔细检查了一遍,一切正常,可以看到断点被捕获,跟踪也有输出。我在应用程序启动时使用了 FederatedAuthentication.ServiceConfigurationCreated += onServiceConfigurationCreated;。 - RubbleFord
4个回答

5

浏览器 cookies 使用“旧”机制 - DPAPI 进行加密。因此,当服务器尝试解密cookies时会失败 - 您的代码现在使用RSA而不是DPAPI。

为了解决这个问题,请清除浏览器缓存,然后应用程序将按预期运行。


我们从来没有使用过其他的系统,因为我们处于负载均衡环境中。 - RubbleFord

2

我改变了实现方式,通过修改ontokencreated方法中的超时时间来避免重新发行令牌。

protected override void OnSessionSecurityTokenCreated(Microsoft.IdentityModel.Web.SessionSecurityTokenCreatedEventArgs args)
        {
            args.SessionToken = FederatedAuthentication.SessionAuthenticationModule.CreateSessionSecurityToken(
                args.SessionToken.ClaimsPrincipal,
                args.SessionToken.Context,
                DateTime.UtcNow,
                DateTime.UtcNow.AddDays(365),
                true
                );
            //base.OnSessionSecurityTokenCreated(args);
        }

这个覆盖重载在你遇到的异常方面具体是做什么的? - ABC
抱歉,我记不得了,我得查看代码库。 - RubbleFord
谢谢,如果你有时间的话,能告诉我一声吗? - ABC

0
你尝试将loadUserProfile选项设置为true了吗?问题还存在吗?
(在IIS中选择应用程序池,然后单击右侧的“高级设置”。 “Load User Profile”位于“Process Model”部分。)

我们还没有尝试过这个,纯粹是因为我们正在使用RSA而不是DPAPI。 - RubbleFord

0

你的错误偶尔发生,再加上跟踪日志中出现DPAPI异常,这提示我你实际上没有覆盖cookie transform,你的服务仍在使用DPAPI。

这可能有点牵强,但是我在你的代码片段中注意到你的方法覆盖“onServiceConfigurationCreated”以小写o开头。这样的拼写错误确实会防止你正确地覆盖默认的WIF行为。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接