1

作为这个问题的序言,如果我的任何术语有误,请原谅我。这项技术对我来说非常新。

我在 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

重要的是要注意“开发”子域位于网络场或负载平衡或其他东西中。我目前不知道负载平衡架构的确切细节。

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

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

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-发生-尝试解密-cookie-使用-the-protecteddata-api.aspx)。但是,该网站声明该解决方案适用于 .Net 4.0。

该解决方案是否适用于 .Net 4.5?而且,如果没有,我该如何解决这个错误?

4

3 回答 3

1

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

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

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

在 VS 2012 中,右键单击项目 > 选择身份访问 > 选择配置选项卡 > 选中启用网络场就绪 cookie 复选框 > 单击确定

于 2013-11-05T15:51:23.863 回答
0

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

于 2013-10-11T17:36:37.200 回答
0

删除FedAuthcookie 可能有效。发生异常时,Application_Error在文件的方法中试试这个Global.asax

Microsoft.IdentityModel.Web.FederatedAuthentication.SessionAuthenticationModule.SignOut();
于 2015-06-23T18:00:24.153 回答