web-dev-qa-db-ja.com

ユーザーがASP.NET MVCでブラウザーまたはタブを閉じたときに、ユーザーをログアウトするにはどうすればよいですか?

ユーザーがタブまたはブラウザーを閉じたときにユーザーをサインアウトする必要があります。ASP.NETMVCでそれを行うにはどうすればよいですか?

9
RandomUser

ブラウザーを閉じたときにユーザーがログアウトしていることを確認するには、いくつかの方法がありますが、それはFormsAuthentication Cookieの設定方法によって異なります。

  1. _Cookieless=True_を使用します。
  2. FormsAuthenticationTicketを永続的でないように設定します
  3. _FormsAuthentication.SetAuthCookie_を使用して永続性をfalseに設定します
  4. JavaScriptのアプローチを使用して、_window.unload_のCookieを削除します。

_Cookieless=True_アプローチ:

_<system.web>
  <authentication mode="Forms">
    <forms loginUrl="/Account/Login"
           protection="All"
           cookieless="true" //set to true   
  </authentication>
</system.web>
_

これにより、各リクエストのクエリ文字列にcookie値が追加されます。このアプローチの問題は、あまり安全ではなく、SEOに干渉することです。ユーザーが使用しているURLを誰かに送信した場合、そのユーザーは元のユーザーとしてログインできます(たぶん、あなたが望んでいるものではありません)。 「SEOをいじる」限り、渡されるURLに基​​づいて、同じページがgooglebotとは異なって見えます。QueryStringを変更するたびに、新しいURLになり、誰かがこれを使用してリンクを投稿した場合。特定の実際のURLの検索結果を希釈します。

FormsAuthenticationTicketアプローチ

ユーザーの認証Cookieを設定するときは、PersistentをFalseに設定します。

_FormsAuthentication.SetAuthCookie_でこれを行っている場合、これがデフォルトです。 FormsAuthenticationTicketクラスを使用する場合は、Cookieの有効期限を指定する必要があります。

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

);
_

FormsAuthentication.SetAuthCookie()アプローチ

デフォルトでは、persistentを設定しない場合、認証Cookieはセッションの終了時(ユーザーがブラウザーを閉じたとき)に期限切れになります。

_FormsAuthentication.SetAuthCookie("CookieValue", false); //second argument is persistent'
_

JavaScriptアプローチ:

絶対確実な方法はありません。できることは Cookieの有効期限を今より前に設定すること で、ユーザーのブラウザが協調して動作することを願っています。本当に、本当に、本当にCookieを削除したい場合は、いつでもJavaScriptのアプローチを試すことができますが、ユーザーがJavaScriptを無効にしている場合は機能しません。

_window.addEventListener('unload', function(event) {
   document.cookie = name + '=; expires=Thu, 01 Jan 1970 00:00:01 GMT;';
});
_

その他の警告

また、使用するブラウザも重要です。 Chrome=バックグラウンドで実行する機能があり、 タイムアウトになるまでセッションCookieを保持します-ブラウザが閉じてもドロップされません (私はこれを難しい方法で見つけました)。

27
George Stocker