【问题标题】:Logoff User when browser tab page is closed, ASP.NET MVC关闭浏览器标签页时注销用户,ASP.NET MVC
【发布时间】:2009-09-02 10:04:59
【问题描述】:

在其中一个 ASP.NET MVC 应用程序中,如果用户关闭打开应用程序的浏览器选项卡,我们希望自动注销用户。

当他进行身份验证时,我们正在使用以下代码。

FormsAuthentication.SetAuthCookie(userName, false)

到目前为止,如果我们关闭浏览器窗口并重新启动它,用户会被要求再次进行身份验证。但我们希望用户在关闭选项卡并尝试访问任何网站 url 时再次进行身份验证。

【问题讨论】:

  • 我质疑这个功能。如果用户让您的网站在两个选项卡中打开并关闭一个选项卡怎么办?
  • 没有任何可靠的方法可以做到这一点,我认为没有任何理由实施这样的功能
  • 如果您要考虑并发用户,我可以理解这样做的必要性。

标签: asp.net asp.net-mvc


【解决方案1】:

我们决定使用无 cookie 身份验证,以便身份验证令牌成为 url 的一部分。 When the tab is closed and they open the website again, they will be asked to authenticate again :)

【讨论】:

  • 这意味着身份验证令牌将保存在比您预期更多的地方 - 许多公司防火墙和其他过滤器记录 url。甚至您自己的网站日志也会显示它们(这意味着您只是让任何具有基本文件访问权限的网络管理员或数据中心员工能够通过从标准 IIS/Apache 日志文件复制 url 来模拟用户)
  • 我已将其重定向到正文标签中的 LogOff,卸载事件,检查:stackoverflow.com/a/60840992/747897
【解决方案2】:

我自己没有尝试过,但我认为以下方法应该可行:

在客户端,您可以使用文档的 OnUnload 事件来启动一个 javascript 函数,该函数将通过 ajax 调用您的服务器端注销方法。

在服务器端,您应该调用 FormsAuthentication.SignOut() 和 Session.Abandon() 的操作方法;

【讨论】:

  • 请注意这一点,因为在离开页面时也会触发 onunload。据我所知,没有任何方法可以检查用户是否正在导航或关闭......
  • unload 在移动到网站的每个页面之前被触发。但我想处理标签关闭。
  • 对不起,我忘了你可能不是在写 AJAX 网站。我正在通过 AJAX 调用(使用定制的 jquery 插件)加载所有新内容,因此只有在关闭选项卡或窗口时才会收到 unloadevent。
【解决方案3】:

浏览器仅在完全关闭时清除所有 Session 范围的对象,而不是在单个选项卡关闭时。

一种方法是使用非常低的会话超时,并每隔几秒进行一次服务器端脚本轮询以命中页面上的对象。这将再次延长会话时间。因此,如果关闭选项卡,脚本将找不到对象,从而使会话超时。这里的一个问题是,如果您的应用程序负载非常高,您的应用程序本身可能会 DoS!

【讨论】:

    【解决方案4】:

    实际上,当用户关闭浏览器选项卡时,我们无法注销用户。唯一的方法是在我们调用 Controller 中的 LogOn 方法时检查用户是否经过身份验证。

    此代码是我如何在 ASP.Net MVC 3 中执行此操作的示例。

    public ActionResult LogOn()
            {
                if (Request.IsAuthenticated)
                {
                    FormsAuthentication.SignOut();
                    return RedirectToAction("Index","ProductManager");  
                }
               return View();          
            }
    

    【讨论】:

      【解决方案5】:

      您可以简单地使用会话变量来自动注销任何试图返回安全目标页面的人。创建单个会话变量(整数或布尔值),并在您的登录按钮的 onclick 事件中,在确认用户具有有效凭据后将其重置为已知状态,然后在您尝试的页面的 page_load 事件中设置或增加该会话变量以确保。如果用户尝试返回页面,则测试这些值并注销用户,否则不执行任何操作。代码可能与此类似。

      protected void btnLogin_Click(object sender, EventArgs e)
       {
               if (IsAuthenticated == true)
               Session["IsUserLoggedIn"] = (int)0;
       }
      
       protected void Page_Load(object sender, EventArgs e)
      {
          if (HttpContext.Current.User.Identity.IsAuthenticated == true)
                      {
                              if (Session["IsUserLoggedIn"] != null)
                              {
                                      int IsUserLoggedIn = (int)Session["IsUserLoggedIn"];
                                      if (IsUserLoggedIn <= 0)
                                      {
                                              Session["IsUserLoggedIn"] = (int)IsUserLoggedIn + 1;
                                      }
                                      else
                                      {
                                              Session["IsUserLoggedIn"] = (int)0;
                                              FormsAuthentication.SignOut();
                                              FormsAuthentication.RedirectToLoginPage();
                                      }
                              }
                      }
                      else { Session["IsUserLoggedIn"] = (int)0; } 
              }
      

      【讨论】:

      • 这种方法有一个严重的错误。登录后,如果我刷新上面已经实现 Page_Load 的主页,它会注销我。
      猜你喜欢
      • 2020-12-27
      • 2020-10-23
      • 1970-01-01
      • 1970-01-01
      • 2017-12-28
      • 2014-07-01
      • 2015-08-22
      • 2017-01-19
      • 2012-06-16
      相关资源
      最近更新 更多