8

我一直在使用 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,这可能是由于应用程序池上的 loadUserProfile 设置设置为 false。

我有一种感觉,正如我所想的那样,这让我走上了一条黑暗的小巷,因为我已经将实现更改为使用 RSA,这不应该影响我。

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

4

4 回答 4

4

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

作为一种解决方法,清除浏览器缓存,应用程序将按预期开始运行。

于 2012-05-28T20:49:19.287 回答
2

我更改了实现以修改 onkencreated 方法中的超时。这可以防止重新发布。

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);
        }
于 2012-06-07T20:55:10.333 回答
0

您是否尝试将 loadUserProfile 选项设置为 true?问题是否仍然存在?

(在 IIS 中选择应用程序池,然后单击右侧的“高级设置”。“加载用户配置文件”在“进程模型”部分)。

于 2012-05-28T19:16:09.120 回答
0

您的错误间歇性发生,再加上您的跟踪中显示的 DPAPI 异常,这表明您实际上并未覆盖 cookie 转换,并且您的服务仍在使用 DPAPI。

这可能是一个长镜头,但在您的代码片段中,我注意到您的方法覆盖“onServiceConfigurationCreated”以小写 o 开头。这样的错字确实会阻止您正确覆盖默认 WIF 行为。

于 2012-06-01T20:07:07.820 回答