如何在ASP.NET MVC中关闭浏览器或选项卡时将用户注销?

Ran*_*ser 9 c# asp.net authentication asp.net-mvc form-authentication

我需要在用户关闭选项卡或浏览器时注销用户,我该如何在ASP.NET MVC中执行此操作?

Geo*_*ker 27

在浏览器关闭时,您可以执行一些操作来确保用户已注销,但这取决于您如何设置FormsAuthentication cookie:

  1. 使用Cookieless=True.
  2. 将FormsAuthenticationTicket设置为不持久
  3. 使用FormsAuthentication.SetAuthCookie于持久性设置false
  4. 使用JavaScript方法删除cookie window.unload.

Cookieless=True 做法:

<system.web>
  <authentication mode="Forms">
    <forms loginUrl="/Account/Login"
           protection="All"
           cookieless="true" //set to true   
  </authentication>
</system.web>
Run Code Online (Sandbox Code Playgroud)

这会将cookie值附加到每个请求中的查询字符串.这种方法的问题是它不是很安全,它与SEO混淆.如果用户向任何人发送他们正在使用的URL,那么该人可以作为原始用户登录(可能不是您想要的).至于"搞乱搜索引擎优化",它会导致同一页面看起来与基于传入的URL的googlebot不同.每个QueryString更改使其成为一个新的URL,如果有人使用它来发布链接; 它会稀释给定实际URL的搜索结果.

FormsAuthenticationTicket 途径

为用户设置身份验证cookie时,请将Persistent设置为False.

如果你这样做FormsAuthentication.SetAuthCookie,这是默认的.如果您使用FormsAuthenticationTicket该类,则必须指定cookie过期.

FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
    1,                   //version
    "blah",              //Cookie Name 

);
Run Code Online (Sandbox Code Playgroud)

FormsAuthentication.SetAuthCookie() 途径

默认情况下,如果未设置persistent,则身份验证cookie将在会话结束时(用户关闭浏览器时)到期.

FormsAuthentication.SetAuthCookie("CookieValue", false); //second argument is persistent'
Run Code Online (Sandbox Code Playgroud)

JavaScript方法:

没有万无一失的方法; 您所能做的就是将Cookie过期日期设置为之前,并希望用户的浏览器合作.如果你真的,真的,真的,希望cookie消失,你总是可以尝试JavaScript方法,但如果用户禁用了JavaScript,这将无效.

window.addEventListener('unload', function(event) {
   document.cookie = name + '=; expires=Thu, 01 Jan 1970 00:00:01 GMT;';
});
Run Code Online (Sandbox Code Playgroud)

其他警告

您使用哪种浏览器也很重要.Chrome可以在后台运行,并且可以使会话Cookie保持不变,直到超时达到 - 当浏览器关闭时它们不会被丢弃(我发现这很难).