MachineKeySessionSecurityTokenHandler和会话令牌在应用程序重新启动之间到期

时间:2013-04-12 21:27:10

标签: wif claims-based-identity

在我的MVC应用程序中,我使用表单身份验证来验证用户,然后使用System.IdentityModel.Services.SessionAuthenticationModule来保持会话。

虽然我还没有达到必要的程度,但我确实想利用System.IdentityModel.Services.Tokens.MachineKeySessionSecurityTokenHandler,以便应用程序可以很好地存在于Web场上(如Dominick Baier here所述)。

我遇到的问题是,鉴于基于machineKey的处理,我希望会话不仅可以从服务器机器到机器有效,而且还应该在应用程序重启后继续存在。但是,每当我重新启动或重建应用程序时,在浏览器中点击应用程序时,cookie显然会变为无效,我会被退回到身份验证屏幕。一旦再次验证,一切都很好,会话仍然存在。但是,下次重新启动或重建应用程序时,我不得不重新进行身份验证。

我确定这是WIF的一个方面,我没有得到,但我只是不知道从哪里转过来。我并不害怕延长MachineKeySessionSecurityTokenHandler,但我想确保在继续之前我理解这里发生了什么。我理解默认SessionSecurityTokenHandler将DPAPI与应用程序池中的某些标识符结合使用以进行加密,因此在这种情况下会发生这种情况,但MachineKeySessionSecurityTokenHandler中的行为让我感到困惑。应用程序中是否仍有一些标识符在MachineKeySessionSecurityTokenHandler依赖的重启时重新创建?我只是错过了一个设置吗?

以下是我的web.config中的相关部分:

<configSections>
  <section name="system.identityModel"
           type="System.IdentityModel.Configuration.SystemIdentityModelSection, System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
</configSections>

...

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

...

<system.web>
  <machineKey compatibilityMode="Framework45"
              validationKey="E27893..."
              decryptionKey="ABC..." 
              validation="SHA1" decryption="AES" />
  <authentication mode="Forms">
  <forms loginUrl="~/Account/Login"
         timeout="10080" />
  </authentication>
</system.web>

...

<system.webServer>
  <modules runAllManagedModulesForAllRequests="true">
    <add name="SessionAuthenticationModule"
         type="System.IdentityModel.Services.SessionAuthenticationModule, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
  </modules>
</system.webServer>

2 个答案:

答案 0 :(得分:2)

hm - 如果你明确地设置机器密钥(就像你似乎那样) - 我没有看到为什么这不起作用的原因。也许您正在使用其他cookie,会话等触发重新验证问题?

答案 1 :(得分:0)

好吧,这是我的愚蠢错误。由于这里不相关的原因,我将FedAuth cookie名称设置为非标准的(即不是“FedAuth”),如下所示:

FederatedAuthentication
  .FederationConfiguration
  .CookieHandler
  .Name = "SomeThingNotStandard";

问题是我只是在成功登录时发出令牌时才这样设置。嗯,当然一切都会好的,因为现在内存配置正在寻找“SomeThingNotStandard”作为cookie名称。但是,在重新启动应用时,配置将恢复为默认值,查找“FedAuth”,而不是“SomeThingNotStandard”。这会强制重新登录,一旦成功,重新配置应用程序,然后一切似乎都很好。

所以我将代码位置放在Application_Start()中,并且在重新构建和重新启动时它可以正常工作。

我的愚蠢行为。

修改

我将其移至配置

<system.identityModel.services>
  <federationConfiguration>
    <cookieHandler
      name="SomeThingNotStandard" />
  </federationConfiguration>
</system.identityModel.services>