2

我在带有 IIS 7.5 的 Windows Server 2008 上托管我的 Web 应用程序,我有 2 个 Web 应用程序: 1. 第一个是带有登录页面的核心 sso(单点登录)服务。2. 另一个 Web 应用程序托管在使用第一个应用程序进行 sso 的同一 Web 服务器上。

我正在使用 WIF RTM 来实现 sso,

通常,它运行良好,没有任何问题,用户可以登录并抛出 sso 并重定向回起始页面。但是当我登录时先抛出 sso,然后重新启动 IIS,如果我回到第二个应用程序并刷新页面,则会出现以下错误:

“/”应用程序中的服务器错误。密钥在指定状态下无效。说明:执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息:System.Security.Cryptography.CryptographicException:密钥在指定状态下无效。

源错误:在执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪来识别有关异常起源和位置的信息。

堆栈跟踪:

[CryptographicException:密钥在指定状态下无效。]
System.Security.Cryptography.ProtectedData.Unprotect(Byte[] encryptedData, Byte[] optionalEntropy, DataProtectionScope 范围) +425
Microsoft.IdentityModel.Web.ProtectedDataCookieTransform.Decode(Byte[] 编码) +59

[InvalidOperationException:ID1073:尝试使用 ProtectedData API 解密 cookie 时发生 CryptographicException(有关详细信息,请参阅内部异常)。如果您使用的是 IIS 7.5,这可能是由于应用程序池上的 loadUserProfile 设置设置为 false。] Microsoft.IdentityModel.Web.ProtectedDataCookieTransform.Decode(Byte[] 编码) +151
Microsoft.IdentityModel.Tokens.SessionSecurityTokenHandler.ApplyTransforms(Byte[] cookie, Boolean outbound) +109
Microsoft.IdentityModel.Tokens.SessionSecurityTokenHandler.ReadToken(XmlReader reader , SecurityTokenResolver tokenResolver) +634
Microsoft.IdentityModel.Tokens.SessionSecurityTokenHandler.ReadToken(Byte[] token, SecurityTokenResolver tokenResolver) +105
Microsoft.IdentityModel.Web.SessionAuthenticationModule.ReadSessionTokenFromCookie(Byte[] sessionCookie) +239
Microsoft.IdentityModel.Web.SessionAuthenticationModule.TryReadSessionTokenFromCookie(SessionSecurityToken& sessionToken) +59
Microsoft.IdentityModel.Web.SessionAuthenticationModule.OnAuthenticateRequest(Object sender, EventArgs eventArgs) +52
System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +68 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +75

________________________________________ 版本信息:Microsoft .NET Framework 版本:2.0.50727.4927;ASP.NET 版本:2.0.50727.4927

用户会话是使用 SQLServer 会话模式存储的,我为此使用了一个特殊的数据库。

我已经尝试了很多,我无法在我的本地计算机(Windows7)上重新处理这个问题。有没有人有类似的经历?你能告诉我如何解决这个问题吗?

4

3 回答 3

2

我最终通过将应用程序池用户更改为本地用户来解决这个问题。该问题可能是由 sso 托管在 64 位操作系统上引起的,如果我将 sso 托管在 32 位计算机上(即使我将域用户用于应用程序池),则不存在此问题。

现在我使用 ApplicationPoolIdentity 或 NetWork Service,重启 IIS 后异常消失。

谢谢大家,我很高兴与您分享我的解决方案。

于 2010-02-23T09:27:04.210 回答
1

当您有多个应用程序在带有 IIS 7.5 的 Win Server 2008 上共享同一个域时,似乎存在某种安全问题

如果您有 url http://ourdomain.com/app1,并且http://ourdomain.com/app2您可以使用 WIF 登录一个应用程序,但是当您访问另一个应用程序时,您会收到此错误。这是因为 Cookie 是针对域的,但如果它是由 app1 创建的,那么 app2 就无法访问它。

因此,解决方案是要么像 Aaron 一样使用具有访问权限的特定用户,要么像我们一样,将应用程序分隔在两个不同的域上,即http://app1domain.com/http://app2domain.com/.

于 2010-02-23T16:29:43.747 回答
0

这很可能是因为您的应用程序池用户没有持久的用户配置文件。要纠正这个问题,您可以以该用户身份运行一些东西:

runas /user:<domain>\<user> cmd

这将创建配置文件。随后,在重新启动 IIS 后数据应该是可解密的。

于 2012-09-03T15:32:00.113 回答