如何通过门户中的注销按钮从所有打开的Web应用程序注销?

时间:2014-01-19 12:32:00

标签: asp.net security post portal

我使用post method通过我的门户网站打开不同的网站,如下所示:

在我的门户网站主页中:

<form method="post" target="_blank" action="">
<input id="Hdn_r" name="Hdn" type="hidden" value="55622"> 
.....
</form>

然后在any site opened through the portal的主页面中执行以下检查:

var hr = HttpContext.Current.Request.UrlReferrer;
        if (hr != null && !string.IsNullOrEmpty(hr.AbsolutePath))
        {
            if (Request.UrlReferrer.AbsolutePath.Contains("Portal"))
            {

                if (Request.Form["Hdn_r"] != null && !string.IsNullOrEmpty(Request.Form["Hdn_r"].ToString())
                   && Request.Form["Hdn_a"] != null && !string.IsNullOrEmpty(Request.Form["Hdn_a"].ToString()) &&
                   Request.Form["Hdn_b"] != null && !string.IsNullOrEmpty(Request.Form["Hdn_b"].ToString()) &&
                   Request.Form["Hdn_c"] != null && !string.IsNullOrEmpty(Request.Form["Hdn_c"].ToString())
                   )
                {

                  Session["emp_num"]= int.Parse(Request.Form["Hdn_r"].ToString());
                //...........

我的问题是:

如何在我的门户网站的注销按钮中点击一下,从所有已打开的网站注销?

假设我通过我的门户打开了三个网站,我希望当我退出(在门户网站中)从所有打开的应用程序中注销我?

注意:门户网站中的不同网站在不同的服务器上发布。

6 个答案:

答案 0 :(得分:4)

在您的所有网站中创建一个退出页面。然后,当您要注销时,使用ajax调用这些注销页面。或者将httprequests发送到该注销页面。您无法直接注销,因为它们不在同一个域中,并且一个站点无法更改另一个站点的会话。

答案 1 :(得分:2)

为什么不尝试针对所有网站制作正确的POST请求,以便以编程方式登录?

请参阅http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest(v=vs.110).aspx

答案 2 :(得分:2)

你无法在另一个网站上获得一个网站的会话。不同的网站有不同的会话状态。此外,如果您想解决上述问题,请在您的应用程序中使用 Cookies 。 Cookie详细信息存储在浏览器中,可以在全球范围内访问所有网站。当您登录门户网站时,使用您的登录凭据创建一个cookie,如果您点击网站门户网站上提供的任何网站链接,请使用您的cookie信息登录。最后,如果您点击任何注销按钮,请清除您的cookie信息。试试吧。

答案 3 :(得分:2)

第一个问题是你如何管理你的连接。 ?

有一件事可能是在任何页面的前端控制器中检查的状态标志,如果该标志为false,则重定向到登录页面并且您将终止所有会话数据。

答案 4 :(得分:2)

你真的有一个“登录”意味着什么的概念吗?

据我所知,您的用户只是通过隐藏的Session变量登录 - 所以只要他关闭任何这些页面的浏览器窗口,他就不再登录了。因为如果他打开了没有隐藏会话变量的页面变量他没有登录。

我会像大多数SSO解决方案一样(例如Shibboleth) - 没有“退出”这样的东西,你有一个活跃的会话,在这个会话中,你被SSO服务识别为某个用户,验证你的凭据 - 当您关闭此会话并打开一个新会话,您必须再次进行验证。如果您未再次验证,则在新会话中以匿名用户身份访问该页面 - 就用户体验而言,与“已注销”相同

注销通常只是删除cookie(如果cookie正在使用,即使然后并非总是如此),并使服务器上的当前会话令牌无效。但对于许多服务(尤其是单点登录解决方案)而言,情况并非如此,这些服务只是让用户相信他已经“退出”,将他重置为新的会话,而他尚未通过SSO服务器进行验证。

答案 5 :(得分:1)

如果不详细了解您的实施方法,您可以按名称打开一个新窗口,并将其名称作为表单目标(sample),您需要进行以下更改:

  1. 更新您的登录按钮以使用javascript发布:

    // holds the list of opened websites, used later for logout.
    var openedWebsites = [];
    
    function login(siteName) {
      openedWebsites.push(siteName);
      var windowName = siteName + "_window";
      //assuming you name your forms as "{sitename}_loginForm"
      var loginForm = siteName + "_loginForm";
    
      var form = document.getElementById(loginForm);
      form.target = windowName;
      window.open("",windowName);
      form.submit();
    }
    
  2. 然后让您的注销按钮向每个窗口发布注销请求:

    function logout(){
      for(var x=0;x<openedWebsites.length;x++){
        var siteName = openedWebsites[x]; 
        var windowName = siteName + "_window";
        //assuming you name your forms as "{sitename}_logoutForm"
        var logoutForm = siteName + "_logoutForm";
    
        var form = document.getElementById(logoutForm);
        form.target = windowName;
        form.submit();
        }
    }