“密钥无法在指定状态下使用”.Net 4.5 MVC 4应用程序出错

时间:2013-10-11 16:45:33

标签: asp.net-mvc-4 iis-7 .net-4.5 wif web-farm

为了提出这个问题,请原谅我,如果我的任何术语错了。这项技术对我来说很新鲜。

我有一个MVC 4的网站,.Net 4.5是在IIS7上托管的VS 2012构建的,并使用“身份和访问”向导使用业务标识提供程序配置身份验证。我输入了一个STS元数据文档的路径,类似于:

https://xyz.mycompany.com/app/FederationMetadata/2007-06/FederationMetadata.xml

该网站目前托管在三个不同的领域。第一个是我的本地开发环境,第二个是标准集成测试,第三个是开发。

http://localhost/myapp
http://sit.mycompanytest.com/myapp
http://dev.mycompanytest.com/myapp

请务必注意,“dev”子域位于Web场中或负载均衡或其他内容。我目前不知道负载均衡架构的确切细节。

当我使用IE 10导航到上述任何网站时,我被重定向到登录屏幕,在那里我输入我的凭据并获得对给定网站的访问权。

但是,在“dev”子域中,当使用链接和表单提交在网站上导航时,我最终会收到以下错误:

Key not valid for use in specified state.

错误的堆栈跟踪是:

[CryptographicException: Key not valid for use in specified state.]
System.Security.Cryptography.ProtectedData.Unprotect(Byte[] encryptedData, Byte[] optionalEntropy, DataProtectionScope scope) +397
System.IdentityModel.ProtectedDataCookieTransform.Decode(Byte[] encoded) +90

[InvalidOperationException: ID1073: A CryptographicException occurred when attempting to decrypt the cookie using the ProtectedData API (see inner exception for details). If you are using IIS 7.5, this could be due to the loadUserProfile setting on the Application Pool being set to false. ]
System.IdentityModel.ProtectedDataCookieTransform.Decode(Byte[] encoded) +1158198
System.IdentityModel.Tokens.SessionSecurityTokenHandler.ApplyTransforms(Byte[] cookie, Boolean outbound) +173
System.IdentityModel.Tokens.SessionSecurityTokenHandler.ReadToken(XmlReader reader, SecurityTokenResolver tokenResolver) +756
System.IdentityModel.Tokens.SessionSecurityTokenHandler.ReadToken(Byte[] token, SecurityTokenResolver tokenResolver) +100
System.IdentityModel.Services.SessionAuthenticationModule.ReadSessionTokenFromCookie(Byte[] sessionCookie) +668
System.IdentityModel.Services.SessionAuthenticationModule.TryReadSessionTokenFromCookie(SessionSecurityToken& sessionToken) +164
System.IdentityModel.Services.SessionAuthenticationModule.OnAuthenticateRequest(Object sender, EventArgs eventArgs) +173
System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +80
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +165

我怀疑负载均衡器更改服务器时发生了错误。

并且,一直在考虑来自以下网站的第二个解决方案:(http://blogs.msdn.com/b/distributedservices/archive/2012/10/29/wif-1-0-id1073-a-cryptographicexception-occurred-when-attempting-to-decrypt-the-cookie-using-the-protecteddata-api.aspx)。但是,该网站指出该解决方案适用于.Net 4.0。

该解决方案适用于.Net 4.5吗?如果没有,我该如何解决错误?

3 个答案:

答案 0 :(得分:1)

我可以按照Vittorio Bertocci的以下帖子中的说明修复错误:

http://www.cloudidentity.com/blog/2013/01/28/running-wif-based-apps-in-windows-azure-web-sites-4/

基本上,我必须使用身份和访问工具启用Web场cookie。

在VS 2012中,右键单击项目>选择身份访问>选择配置选项卡>选中“启用Web场准备好的cookie”复选框>单击确定

答案 1 :(得分:0)

恕我直言,负载均衡是问题所在。您必须确保服务器场共享相同的计算机密钥。这可以在机器级别或应用程序的web.config中完成。

答案 2 :(得分:0)

删除FedAuth Cookie可能有效。发生异常时,请在Application_Error文件的Global.asax方法中尝试此操作:

Microsoft.IdentityModel.Web.FederatedAuthentication.SessionAuthenticationModule.SignOut();