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文件为以下(与上面相同的代码)"

W.I.F:将IsSessionMode设置为true,似乎不能使它发生

旧线程,但我相信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类的SecurityTokenValidatedSessionSecurityTokenCreated事件。

选项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;
}