W.I.F.I。:设置会话模式为真,似乎无法实现

时间:2011-10-19 18:02:44

标签: c# web-applications wif

我们遇到了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吗?

http://social.msdn.microsoft.com/Forums/en/Geneva/thread/ea00ec3f-ebdf-427c-929f-d4a196650552 http://blogs.msdn.com/b/vbertocci/archive/2010/05/26/your-fedauth-cookies-on-a-diet-issessionmode-true.aspx

从“编程Windows®IdentityFoundation”一书中: “SAM的一个有趣属性是IsSessionMode。当设置为true时,IsSessionMode具有 将大量会话存储在服务器端令牌缓存而不是写入的效果 cookie中的所有内容。 cookie本身只包含一个小的上下文标识符 将用于检索服务器上的会话。不幸的是,在这个版本的92第二部分身份开发者Windows身份基础 产品无法从配置文件中设置IsSessionMode。你可以通过一个来设置它 PassiveSignInControl的属性,或global.asax文件中的属性如下(与上面相同的代码)“

4 个答案:

答案 0 :(得分:7)

旧线程,但我相信SessionSecurityTokenCreated是处理此问题的正确事件 - 测试它并且它在“旧WIF”和具有适当命名空间变体的.NET 4.5下工作。

void WSFederationAuthenticationModule_SessionSecurityTokenCreated(object sender, System.IdentityModel.Services.SessionSecurityTokenCreatedEventArgs e)
{
    e.SessionToken.IsReferenceMode = true;
}

答案 1 :(得分:3)

您是否为SessionSecurityTokenCreated事件注册了事件处理程序?

FederatedAuthentication.WSFederationAuthenticationModule.SessionSecurityTokenCreated 
    += this.WSFederationAuthenticationModule_SessionSecurityTokenCreated;

此行需要添加到Application_Start文件中的Global.asax方法。

命名空间FederatedAuthentication中的Microsoft.IdentityModel.Web类。

答案 2 :(得分:0)

嗨试试这个:而不是SessionSecurityTokenCreated事件使用SecurityTokenValidated

在global.ascx

void WSFederationAuthenticationModule_SecurityTokenValidated(object sender, SecurityTokenValidatedEventArgs e) 
{   
    FederatedAuthentication.SessionAuthenticationModule.IsSessionMode = true; 
}

查看Dominick Baier的评论blog

答案 3 :(得分:0)

要注意的一件事是如何处理 WSFederationAuthenticationModule 类的 SecurityTokenValidated SessionSecurityTokenCreated 事件。

替代1 -在global.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;
}