无法将声明cookie从.NET 4.5解密为.NET 3.5

时间:2014-02-13 12:22:17

标签: c# .net .net-3.5 .net-4.5 claims-based-identity

我一直试图让以下场景工作一周左右而没有运气。我有2个应用程序,一个声称启用的.NET 4.5应用程序,它运行良好(适用于其他.NET 4及更高版本的应用程序);以及使用WebForms .NET 3.5构建的传统Intranet系统。遗留应用程序无法升级到更高版本的.NET(会更容易)。

我想要发生的是,当我登录.NET 4.5应用程序时,我需要在访问.NET 3.5应用程序时进行身份验证。我确保应用程序之间的Cookie名称相同,并且web.config中的machineKey值是相同的(我使用MachineKeySessionSecurityTokenHandler来确保即使在Web场景中,encyrpted cookie值也是相同的);然而,当我转移到.NET 3.5应用程序时,我从SymmetricEncryptionFormatter类中得到以下错误:

  

ID0006:输入字符串参数为null或empty.Parameter name:value

我尝试将MachineKey密钥(decryptionkey / validationkey / validation / decryptiom)更改为各种不同的组合(确保它们在两个站点之间保持一致)。我可以看到,当我去2个站点时,可以看到具有相同cookie值的相同cookie。我认为这个问题可能与.NET 3.5和Linux之间的加密变化有关。 .NET 4.5(参见[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中的键条目:

<system.identityModel>
<identityConfiguration>
<securityTokenHandlers>
<remove type="System.IdentityModel.Tokens.SessionSecurityTokenHandler, System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<add type="System.IdentityModel.Services.Tokens.MachineKeySessionSecurityTokenHandler, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />  
</securityTokenHandlers>
</identityConfiguration>
</system.identityModel>

<authentication mode="None" />

<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中的键条目:

<authentication mode="None"/>

<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"/>
    <add type="MachineKeySessionSecurityTokenHandler, App_Code"/>
  </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>

1 个答案:

答案 0 :(得分:1)

Cookie的内部格式在WIF和.NET 4.5之间发生了变化。您无法在版本之间共享它们。

而是将两个应用指向同一个STS并让每个应用使用自己的会话cookie。