7

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

虽然我还没有到必要的地步,但我确实想利用这个应用程序以便在网络农场上很好System.IdentityModel.Services.Tokens.MachineKeySessionSecurityTokenHandler运行(如 Dominick Baier 所述)。

我遇到的问题是,考虑到基于 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>
4

2 回答 2

2

嗯 - 如果您明确设置机器密钥(就像您似乎所做的那样) - 我看不出这不起作用的原因。也许您正在使用触发重新验证问题的其他 cookie、会话等?

于 2013-04-14T11:58:54.657 回答
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>
于 2013-04-14T19:31:42.500 回答