为什么我的WIF注销不能将我从所有RP网站注销?
单点登录似乎对我的应用程序和许多其他共享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为我做这些?
正如您可能猜到的一样,STS和您的应用程序都创建了自己的会话cookie,并且它们无法触及彼此的cookie,这就是为什么您需要wsignoutcleanup1.0消息。
在您的应用程序端,只需要调用FederatedSignOut()。它会在你重新发送到STS之前删除你的应用程序会话cookie,所以你在那里的一切都是多余的。
但是,现在由您的STS来正确接收和处理传入的wsignoutcleanup1.0请求。这听起来像你的不是。我会首先确认你的STS代码实际上正在被击中。如果它被击中,但STS会话cookie仍然存在,那么其他事情就是错误的。
按照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();