Logoff User when browser tab page is closed, ASP.NET MVC

Asked
Viewd18558

9

In one of the ASP.NET MVC apps we would like to logoff the user automatically if he closes the browser tab in which the app is opened.

We are using the following code when he authenticates.

FormsAuthentication.SetAuthCookie(userName, false)

As of now, if we closes the browser window and relaunch it, users are asked to authenticate again. But we want to ask users to authenticate again if they close the tab and try to access any of the website urls.

  • There’s no any reliable way of doing this and I don’t see any reason for implementing such a feature.

    Darin Dimitrov30 декабря 2009, 09:04
  • Я сомневаюсь в этой функции. Что, если пользователь открыл ваш сайт на двух вкладках и закрыл одну?

    Craig Stuntz02 сентября 2009, 13:23

5 ответов

6

Мы решили использовать аутентификацию без файлов cookie, чтобы токен аутентификации был частью URL-адреса. Когда вкладка закрывается и они снова открывают сайт, им будет предложено снова пройти аутентификацию :)

  • This means that authentication tokens are going to be saved in a lot more places then you expect - many corporate firewalls and other filters log the url. Even your own website logs will show them (meaning that you just gave any network admin or data center employee with basic file access the ability to impersonate users by copying the url from the standard IIS/Apache log file)

    David03 сентября 2009, 13:14
1

На самом деле мы не можем выйти из системы, когда пользователь закрывает вкладку браузера. Единственный способ для этого - проверить, аутентифицирован ли пользователь, когда мы вызываем метод LogOn в контроллере.

Этот код является примером того, как я это делаю в ASP.Net MVC 3.

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

Я сам не пробовал, но думаю, что следующий подход должен работать:

На стороне клиента вы можете использовать событие OnUnload своего документа для запуска функции javascript, которая будет вызывать ваш серверный метод выхода через ajax.

На стороне сервера у вас должен быть вызов метода действия FormsAuthentication.SignOut () и Session.Abandon ();

  • Sorry, I forgot that you might not be writing an AJAX website. I am loading all new content via AJAX calls (using a custom-made jquery plugin), so I only get an unloadevent when the tab or window is closed.

    Adrian Grigore02 сентября 2009, 14:59
  • Be careful with this, though, as the onunload fires when navigating away from the page as well. And as far as I know, there isn’t any way to check if the user is navigating or closing…

    peirix02 сентября 2009, 10:24
  • выгрузка запускается перед переходом на каждую страницу веб-сайта. Но я хочу закрыть вкладку.

    Gopinath02 сентября 2009, 10:25
1

Вы можете просто использовать переменные сеанса для автоматического выхода из системы любого, кто пытается вернуться на защищенную целевую страницу. Создайте одну переменную сеанса (целочисленную или логическую) и в событии 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; } 
        }
 
3

Браузер очищает все объекты с областью действия сеанса только тогда, когда он полностью закрыт, а не при закрытии отдельной вкладки.

Одним из способов может быть использование очень малого тайм-аута сеанса и опрос сценария на стороне сервера каждые несколько секунд для попадания в объект на странице. Это снова продлит время сеанса. Таким образом, если вкладка закрыта, сценарий не может найти объект, тем самым позволяя сеансу истечь время ожидания. Одна из проблем заключается в том, что если ваше приложение находится на довольно высокой нагрузке, оно может само DoS!