W.I.F:将IsSessionMode设置为true,似乎不能使它发生
本文关键字:不能 true IsSessionMode 设置 | 更新日期: 2023-09-27 18:11:39
我们在Safari(和Opera)上遇到了问题,从我读到的FedAuth cookie太大了。
有一个"巧妙的技巧"要解决这个问题:WIF RTM在SessionAuthenticationModule, IsSessionMode中增加了一个属性。当翻转为true时,IsSessionMode的作用是确保SessionSecurityToken在整个会话期间保持在缓存中,并生成一个只包含会话标识符而不包含会话本身内容的cookie。
我在global.asax:
中有这段代码void WSFederationAuthenticationModule_SessionSecurityTokenCreated(object sender, Microsoft.IdentityModel.Web.SessionSecurityTokenCreatedEventArgs e)
{
FederatedAuthentication.SessionAuthenticationModule.IsSessionMode = true;
}
问题,"FederatedAuthentication.SessionAuthenticationModule。IsSessionMode = true"从不跑…为什么?
是否与"passivesignincontrol"有关?设置IsSessionMode为true?
MSDN文章
your-fedauth-cookies-on-a-diet-issessionmode-true.aspx
选自《Programming Windows®Identity foundation》:
" SAM的一个有趣属性是IsSessionMode。当设置为true,则IsSessionMode具有存储大部分会话的效果在服务器端令牌缓存中,而不是将所有内容写入饼干。cookie本身将只包含一个小上下文标识符,该标识符将用于检索上的会话服务器。不幸的是,在这个版本的92部分II Windows身份基础对于身份开发产品是没有办法的从配置文件中设置IsSessionMode。你可以通过a来设置属性,或者在全局的。Asax文件为以下(与上面相同的代码)"
旧线程,但我相信SessionSecurityTokenCreated是处理此事件的适当事件-测试它,它在"旧WIF"和。NET 4.5下工作,具有适当的命名空间变化
void WSFederationAuthenticationModule_SessionSecurityTokenCreated(object sender, System.IdentityModel.Services.SessionSecurityTokenCreatedEventArgs e)
{
e.SessionToken.IsReferenceMode = true;
}
您是否为SessionSecurityTokenCreated
事件注册了事件处理程序?
FederatedAuthentication.WSFederationAuthenticationModule.SessionSecurityTokenCreated
+= this.WSFederationAuthenticationModule_SessionSecurityTokenCreated;
这一行需要添加到Global.asax
文件中的Application_Start
方法中。
FederatedAuthentication
类在命名空间Microsoft.IdentityModel.Web
中
嗨,试试这个:用SecurityTokenValidated事件代替SessionSecurityTokenCreated事件
void WSFederationAuthenticationModule_SecurityTokenValidated(object sender, SecurityTokenValidatedEventArgs e)
{
FederatedAuthentication.SessionAuthenticationModule.IsSessionMode = true;
}
查看Dominick Baier博客的评论
要注意的一个重要的事情是如何处理WSFederationAuthenticationModule类的SecurityTokenValidated和SessionSecurityTokenCreated事件。
选项1 - auto事件连接在全局。Asax(不需要手动连接到事件的显式方法名):
void WSFederationAuthenticationModule_SecurityTokenValidated(object sender, SecurityTokenValidatedEventArgs e)
{
FederatedAuthentication.SessionAuthenticationModule.IsReferenceMode = true;
}
// or
void WSFederationAuthenticationModule_SessionSecurityTokenCreated(object sender, SessionSecurityTokenCreatedEventArgs e)
{
e.SessionToken.IsReferenceMode = true;
}
备选方案2 -手动方法连接到global.asax中的事件。关键是它不能在Application_Start中,而是在重写Init:
中。void Application_Start(object sender, EventArgs e)
{
// Called only once on application start
// This is not the right place to wire events for all HttpApplication instances
}
public override void Init()
{
// Called for each HttpApplication instance
FederatedAuthentication.WSFederationAuthenticationModule.SecurityTokenValidated += STV;
FederatedAuthentication.WSFederationAuthenticationModule.SessionSecurityTokenCreated += SSTC;
}
void STV(object sender, SecurityTokenValidatedEventArgs e)
{
FederatedAuthentication.SessionAuthenticationModule.IsReferenceMode = true;
}
// or
void SSTC(object sender, SessionSecurityTokenCreatedEventArgs e)
{
e.SessionToken.IsReferenceMode = true;
}