如何强制联邦登出重定向到登录页面



我使用WSFederationAuthentication模块进行身份验证。我想这样:用户按下注销按钮后,他退出(删除所有cookie),并重定向到登录页面。我有退出按钮的代码:

var ls = new LoginStatus();
ls.LogoutAction = LogoutAction.Redirect;
ls.LogoutPageUrl = {some URL, where I have sign out code}

Signout部分:

Microsoft.IdentityModel.Web.WSFederationAuthenticationModule authModule = FederatedAuthentication.WSFederationAuthenticationModule;
String signoutURL = WSFederationAuthenticationModule.GetFederationPassiveSignOutUrl(
authModule.Issuer,
{login Url},
null);
WSFederationAuthenticationModule.FederatedSignOut(
new Uri(signoutURL),
new Uri(authModule.Realm));

这段代码确实做了注销和删除cookie,但没有重定向到登录页面。用户看到的url仍然包含这一部分:, wreply = {loginUrl}

据我所知,wreply参数并不总是被使用。

没有使用FederatedSignOut()方法,我尝试了这个:

System.Net.WebRequest req = System.Net.WebRequest.Create(signoutURL);
System.Net.WebResponse resp = req.GetResponse();
Redirect(LoginUrl);

但是,这并不是真正的签出。当用户下次尝试登录时,他不需要输入任何凭据,并自动登录。我猜,并不是所有的cookie都被删除了。

所以,有我的问题,我怎么能做退出和强制重定向到登录页面?

注:我也会自己删除FedAuth cookie

我想你可能误解了联邦登录和注销的工作原理(我这么说是因为你忽略了我认为最重要的事情。)

当您尝试登录到使用WS-Federation的应用程序时,您实际上被重定向到一个身份提供者(Idp),您登录到这个Idp。一旦登录到Idp,您将使用安全令牌重定向回您的站点,然后您也将登录到您的站点。

在这个阶段,您登录到两个有效的应用程序:

  1. Idp
  2. 您的网站

你想达到什么目标?

  1. 仅退出您的站点
  2. Federated Sign out(即Sign out))

如果我们在情况1中,那么这很简单。删除你的cookie,你会没事的,但是你仍然会登录到Idp,所以当用户导航回你的网站并被重定向到Idp时,他们可能会被重定向到你的网站,没有提示凭据,然后再次登录到你的网站,这似乎有点毫无意义。

鉴于此,我认为你是在场景2之后。在这种情况下,你想要的功能实际上取决于你在Idp上使用的软件,这是你在问题中忽略了的。

不幸的是,我不相信有一种通用的方法可以用所有的Idp做你想做的事情,甚至更多的Idp不会直接支持它。

我认为最好提出一个问题,关于你的Idp是如何工作的,以及如何让它工作。也有一些非常好的东西,包括在问题可能是你的网站和Idp的URL(不是为了"检查出来"的目的,但因为其他间接的解决方案可能是可能的,如果他们在相同的域名下)。此外,关于您的Idp和站点的基础设施的任何信息也会有所帮助,因为特定的设置可以提供间接的解决方案。

似乎是,重定向Url可以是只有 Url,这是写在Idp配置:

<passiveEndpoints>
<endpoint endpointType="WsFed" location="{this url}" binding="Post" />
</passiveEndpoints>
如果wreply参数值是其他url,则无法工作。

"如果在ACSSignOut cookie中指定了wreply参数,则JavaScript重定向到wreply值所指示的地址完成签出。否则,JavaScript将重定向到返回依赖方的URL,在ACS管理中指定门户。"

最新更新