关于C#:无法解密从.NET 4.5到.NET 3.5的声明cookie

Unable to decrypt claims cookie from .NET 4.5 to .NET 3.5

我已经试着让下面的场景工作了大约一个星期,现在没有运气了。我有两个应用程序,一个启用声明的.NET 4.5应用程序,它工作得很好(与其他.NET 4和更高版本的应用程序一起工作);以及一个使用WebForms.NET 3.5构建的旧的内部网系统。旧版应用程序无法升级到.NET的更高版本(这会更容易)。

我希望在登录.NET 4.5应用程序时,访问.NET 3.5应用程序时需要经过身份验证。我已确保应用程序之间的cookie名称相同,web.config中的machinekey值相同(我正在使用machinekeysessionsecuritytokenhandler来确保加密的cookie值即使在Web场方案中也是相同的);但是,当我移动到.NET 3.5应用程序时,会得到来自SymmetricEncryptionFormatter类的以下错误:

ID0006: The input string parameter is either null or empty.Parameter name: value

我尝试将machinekey密钥(decryptionkey/validationkey/validation/decryptiom)更改为各种不同的组合(确保两个站点之间的组合一致)。我可以看到,当我访问两个站点时,相同的cookie和相同的cookie值是可见的。我认为这个问题可能与.NET 3.5和.NET 4.5之间的crytographic变化有关(请参阅此处[http://blogs.msdn.com/b/webdev/archive/2012/10/23/cryptographic-improvements-in-asp-net-4-5-pt-2.aspx])

有人知道这可能是什么原因吗?

.NET 4.5应用程序web.config中的键条目:

1
2
3
4
5
6
7
8
<system.identityModel>
<identityConfiguration>
<securityTokenHandlers>
<remove type="System.IdentityModel.Tokens.SessionSecurityTokenHandler, System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
 
</securityTokenHandlers>
</identityConfiguration>
</system.identityModel>
1
2
3
4
5
6
<system.identityModel.services>
<federationConfiguration>
<cookieHandler requireSsl="false" name="TestName" />
<wsFederation passiveRedirectEnabled="true" issuer="http://localhost:51318/" realm="http://localhost:57083/" persistentCookiesOnPassiveRedirects="true" requireHttps="false" />
</federationConfiguration>
</system.identityModel.services>

.NET 3.5应用程序web.config中的键条目:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<machineKey decryptionKey="CC510DF4..." validationKey="BEAC835EEC..." />

<microsoft.identityModel>
<service>
  <securityTokenHandlers>
    <!-- Replace the SessionSecurityTokenHandler with our own. -->
    <remove type="Microsoft.IdentityModel.Tokens.SessionSecurityTokenHandler, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
   
  </securityTokenHandlers>
</service>
</microsoft.identityModel>

<microsoft.identityModel.services>
<federationConfiguration>
<wsFederation passiveRedirectEnabled="true" issuer="http://localhost:51318/" realm="http://localhost:57083/" requireHttps="false"/>
<cookieHandler requireSsl="false" name="TestName"/>
</federationConfiguration>
</microsoft.identityModel.services>

cookie的内部格式在wif和.NET 4.5之间发生了更改。您不能在版本之间共享它们。

相反,将两个应用程序指向相同的STS,并让每个应用程序使用自己的会话cookie。