密钥无法在指定状态下使用。 IIS重置后

时间:2014-05-07 17:20:13

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

我试过了:

  

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

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

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

我注意到的一件事是,如果我将我的IIS APP池用户切换回网络服务帐户,它不再抛出错误。我们在应用程序中有一些限制(主要是与网络相关),我们需要在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(字节[]   token,SecurityTokenResolver tokenResolver)+105
  Microsoft.IdentityModel.Web.SessionAuthenticationModule.ReadSessionTokenFromCookie(字节[]   sessionCookie)+262
  Microsoft.IdentityModel.Web.SessionAuthenticationModule.TryReadSessionTokenFromCookie(SessionSecurityToken&安培;   sessionToken)+76
  Microsoft.IdentityModel.Web.SessionAuthenticationModule.OnAuthenticateRequest(对象   sender,EventArgs eventArgs)+53
  System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()   +148 System.Web.HttpApplication.ExecuteStep(IExecutionStep step,Boolean& completedSynchronously)+75

1 个答案:

答案 0 :(得分:-1)

此问题与会话cookie有关。 WIF默认使用DAPI保护会话Cookie,而DAPI与机器密钥紧密相关。

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

它也可能与您的应用托管基础架构有关。

  • 如果您的应用在NLB环境中运行
  • 如果您更改应用程序池设置(例如,更改池的用户)

有关此方案的更多详细信息,在这里:

https://blogs.msdn.microsoft.com/distributedservices/2012/10/29/wif-1-0-id1073-a-cryptographicexception-occurred-when-attempting-to-decrypt-the-cookie-using-the-protecteddata-api/

所以, 如果您的应用程序在NLB env中运行,则可以:

  • 配置您的负载均衡器以使用粘性会话。 (这意味着在会话期间您的用户将被定向到同一台服务器)-我不太喜欢那个服务器
  • 使用证书加密会话cookie
  • 将所有web.configs设置为在system.web中使用相同的机器密钥 如果您不在NLB环境中运行该应用程序,则可以尝试:
  • 在web.config中将机器密钥设置为使用预定义的值,而不是自动生成的值

关于自动生成的机器密钥设置,请参阅: https://gyorgybalassy.wordpress.com/2013/12/07/how-unique-is-your-machine-key/