关闭浏览器选项卡页面时注销用户,ASP.NET MVC

时间:2009-09-02 10:05:00

标签: asp.net asp.net-mvc

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

我在验证时使用以下代码。

FormsAuthentication.SetAuthCookie(userName,false)

截至目前,如果我们关闭浏览器窗口并重新启动它,系统会要求用户再次进行身份验证。但是,如果用户关闭标签并尝试访问任何网站网址,我们都会要求用户再次进行身份验证。

5 个答案:

答案 0 :(得分:6)

我们决定使用cookie less authentication,以便身份验证令牌成为url的一部分。当标签关闭并再次打开网站时,系统会要求他们再次进行身份验证:)

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:3)

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

一种方法是使用非常低的会话超时,并且每隔几秒钟进行一次服务器端脚本轮询以命中页面上的对象。这将再次延长会话时间。因此,如果选项卡已关闭,则脚本无法找到该对象,从而允许会话超时。这里的一个问题是,如果你的应用程序负载很高,那么你的应用程序可以自己动手!

答案 3 :(得分:1)

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

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

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

答案 4 :(得分: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; } 
        }