我们遇到了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文件中的属性如下(与上面相同的代码)“
答案 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;
}