在我的 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>