2012-03-27 93 views
3

单点登录似乎对我的应用程序和许多其他共享STS的网站正常工作。当我退出我的应用程序时,我似乎正确地从我的网站注销;但是,我仍然可以访问使用相同STS的其他应用程序,而无需再次登录。任何人都可以告诉我我错过了什么吗?为什么我的WIF注销不能将我从所有RP网站注销?

我的应用程序在阳光下调用了所有东西,试图让它起作用,但是当我只调用FederatedSignOut时,行为是一样的。

FederatedAuthentication.SessionAuthenticationModule.SignOut(); 
FederatedAuthentication.SessionAuthenticationModule.DeleteSessionTokenCookie(); 
FederatedAuthentication.WSFederationAuthenticationModule.SignOut(false); 
System.Web.Security.FormsAuthentication.SignOut(); 
WSFederationAuthenticationModule authModule = FederatedAuthentication.WSFederationAuthenticationModule; 
WSFederationAuthenticationModule.FederatedSignOut(new Uri(authModule.Issuer), new Uri(authModule.Realm)); 

这是我的STS登出码。

SignOutRequestMessage requestMessage = (SignOutRequestMessage)WSFederationMessage.CreateFromUri(Request.Url); 
FederatedPassiveSecurityTokenServiceOperations.ProcessSignOutRequest(requestMessage, User, requestMessage.Reply, Response); 

这是STS的问题,还是与我的应用程序?如果注销至少适用于我的应用程序,这可能是配置问题吗?我是否必须明确地向所有RP发送“wsignoutcleanup1.0”消息,还是应该为ProcessSignOutRequest为我做这些?

回答

2

正如您可能猜到的一样,STS和您的应用程序都创建了自己的会话cookie,并且它们无法触及彼此的cookie,这就是为什么您需要wsignoutcleanup1.0消息。

在您的应用程序端,只需要调用FederatedSignOut()。它会在你重新发送到STS之前删除你的应用程序会话cookie,所以你在那里的一切都是多余的。

但是,现在由您的STS来正确接收和处理传入的wsignoutcleanup1.0请求。这听起来像你的不是。我会首先确认你的STS代码实际上正在被击中。如果它被击中,但STS会话cookie仍然存在,那么其他事情就是错误的。

3

按照link,这是注销URL的结构: 的https:// {DNS_name_of_RP_STS} /adfs/ls/?wa=wsignout1.0 & wreply = {-SIGN后out_landing_URL}

直接调用它或将您的响应重定向到它。

更新:或者您可以使用SignOutRequestMessage对象创建URI。

var fa = FederatedAuthentication.WSFederationAuthenticationModule; 
var signOutRequestMessage = new SignOutRequestMessage(new Uri(fa.Issuer), fa.Realm); 
var signOutURI = signOutRequestMessage.WriteQueryString();