为什么我的WIF注销不会让我退出所有RP网站?

时间:2012-03-27 20:40:40

标签: wif

单点登录似乎适用于我的应用程序和许多共享STS的其他网站。当我退出我的应用程序时,我似乎正确地从我的网站注销;但是,我仍然可以访问使用相同STS的其他应用程序,而无需再次登录。谁能告诉我我错过了什么?

我的应用程序在阳光下调用所有内容,试图让它工作,但当我只调用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 个答案:

答案 0 :(得分:3)

根据link,这是注销网址的结构: 的的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();

答案 1 :(得分:2)

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

在您的应用程序端,只需要调用FederatedSignOut()。它会在重定向到STS之前删除您的应用程序会话cookie,因此您拥有的其他所有内容都是多余的。

然而,现在由您的STS在某些注销端点正确接收和处理传入的wsignoutcleanup1.0请求。听起来你的不是。我首先要确认你的这个STS代码实际上是被击中了。如果它被击中,但STS会话cookie仍然存在,则其他错误。