在我的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>
答案 0 :(得分:2)
hm - 如果你明确地设置机器密钥(就像你似乎那样) - 我没有看到为什么这不起作用的原因。也许您正在使用其他cookie,会话等触发重新验证问题?
答案 1 :(得分:0)
FedAuth
”),如下所示:
FederatedAuthentication
.FederationConfiguration
.CookieHandler
.Name = "SomeThingNotStandard";
问题是我只是在成功登录时发出令牌时才这样设置。嗯,当然一切都会好的,因为现在内存配置正在寻找“SomeThingNotStandard”作为cookie名称。但是,在重新启动应用时,配置将恢复为默认值,查找“FedAuth
”,而不是“SomeThingNotStandard
”。这会强制重新登录,一旦成功,重新配置应用程序,然后一切似乎都很好。
所以我将代码位置放在Application_Start()
中,并且在重新构建和重新启动时它可以正常工作。
我的愚蠢行为。
修改强>
我将其移至配置
<system.identityModel.services>
<federationConfiguration>
<cookieHandler
name="SomeThingNotStandard" />
</federationConfiguration>
</system.identityModel.services>