【问题标题】:Key not valid for use in specified state. After IIS Reset密钥在指定状态下无效。 IIS 重置后
【发布时间】:2014-06-24 19:26:41
【问题描述】:

我试过了:

runas /user: domain\user cmd 没有运气

这似乎只在现在重置 IIS 并且我尝试恢复浏览会话时发生。所以我登录到应用程序,我在服务器上重置 IIS,刷新页面并查看错误。

我正在使用 WIF 4.0 的安全令牌服务在 .NET 4.0 MVC 中构建应用程序。一切都按预期工作,除了这种情况。我什至尝试使用自定义错误页面,但错误也在那里发生。因此,我也无法显示自定义页面。此外,这是使用位于两个负载平衡服务器上的证书。这发生在我的开发环境中,其中仅包含一台服务器(应用程序、wfe、db 在那里运行)

我注意到的一件事是,如果我将 IIS APP Pool 用户切换回网络服务帐户,它就不会再抛出错误了。我们在应用程序中有一些限制(主要是网络相关),我们需要在我们的 AD 中为应用程序池部分使用帐户

有人有这个问题的经验吗?

密钥在指定状态下无效。

描述:执行过程中发生了未处理的异常 当前的网络请求。请查看堆栈跟踪以获取更多信息 有关错误的信息以及它在代码中的来源。

异常详情: System.Security.Cryptography.CryptographicException:密钥无效 在指定状态下使用。

来源错误:

在执行过程中产生了一个未处理的异常 当前的网络请求。有关原产地和位置的信息 可以使用下面的异常堆栈跟踪来识别异常。

堆栈跟踪:

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

[InvalidOperationException:ID1073:发生 CryptographicException 尝试使用 ProtectedData API 解密 cookie 时(请参阅 有关详细信息的内部异常)。如果您使用的是 IIS 7.5,这可能是 由于正在设置应用程序池上的 loadUserProfile 设置 为假。 ]
Microsoft.IdentityModel.Web.ProtectedDataCookieTransform.Decode(字节[] 编码)+146
Microsoft.IdentityModel.Tokens.SessionSecurityTokenHandler.ApplyTransforms(字节 [] cookie,布尔出站)+113
Microsoft.IdentityModel.Tokens.SessionSecurityTokenHandler.ReadToken(XmlReader 阅读器,SecurityTokenResolver tokenResolver) +647
Microsoft.IdentityModel.Tokens.SessionSecurityTokenHandler.ReadToken(字节 [] 令牌,SecurityTokenResolver tokenResolver) +105
Microsoft.IdentityModel.Web.SessionAuthenticationModule.ReadSessionTokenFromCookie(字节 [] sessionCookie) +262
Microsoft.IdentityModel.Web.SessionAuthenticationModule.TryReadSessionTokenFromCookie(SessionSecurityToken& sessionToken) +76
Microsoft.IdentityModel.Web.SessionAuthenticationModule.OnAuthenticateRequest(对象 发件人,EventArgs eventArgs) +53
System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +148 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +75

【问题讨论】:

  • 听起来像一个加密的连接字符串,这解释了为什么将应用程序池用户切换回 orig 可以解决问题。尝试解密字符串,然后更改应用程序池用户。
  • hmmm 很有趣,但我的连接字符串没有在任何地方加密。

标签: asp.net .net iis single-sign-on wif


【解决方案1】:

此问题与会话 cookie 有关。

WIF 默认使用数据保护 API (DPAPI) 保护会话 cookie,而 DPAPI 与 机器密钥 密切相关。

如果用于加密会话 cookie 的密钥发生更改,则会引发此异常。

这也可能与您的应用托管基础设施有关。

  • 如果您的应用在网络负载均衡器 (NLB) 环境中运行
  • 如果您更改应用程序池设置(例如,更改池的用户)

有关此方案的更多详细信息,请参阅 MSDN 博客条目:

WIF 1.0 – ID1073 A CryptographicException occurred when attempting to decrypt the cookie using the ProtectedData API Archive.Today Shortlink

托德·福斯特(2012 年 10 月 29 日)

所以,如果您的应用在 NLB 环境中运行,您可以:

  • 将您的负载平衡器配置为使用粘性会话。这意味着您的用户将在会话期间被定向到同一台服务器。 (我不是很喜欢那个)
  • 使用证书加密会话 cookie
  • 将所有web.config 文件设置为使用system.web 中的相同机器密钥

如果您没有在 NLB 环境中运行应用程序,您可以尝试:

  • web.config 中设置machinekey 以使用预定义值而不是自动生成的值

关于自动生成的machinekey设置,请看:

How unique is your machine key?Archive.Today Shortlink

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-03
    • 1970-01-01
    • 2013-09-11
    • 1970-01-01
    相关资源
    最近更新 更多