作为这个问题的序言,如果我的任何术语有误,请原谅我。这项技术对我来说非常新。
我在 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?而且,如果没有,我该如何解决这个错误?