web-dev-qa-db-ja.com

ASP.NETユーザーをプログラムでログアウトする

私のアプリでは、管理者がユーザーアカウントを一時停止/一時停止解除できます。私は次のコードでこれを行います:

MembershipUser user = Membership.GetUser(Guid.Parse(userId));
user.IsApproved = false;
Membership.UpdateUser(user);

上記はユーザーを一時停止するために正常に機能しますが、セッションを取り消すことはありません。その結果、一時停止されたユーザーは、セッションCookieが残っている限り、アプリケーションへのアクセスを維持できます。任意の修正/

24
Testing123

セッションの「外部」からセッションを放棄する方法はありません。ページが読み込まれるたびにデータベースを確認する必要があります。アカウントが無効になっている場合は、サインアウトしてください。 HttpModuleを使用してこれを実現することもできます。これにより、状況が少しきれいになります。

例えば:

public class UserCheckModule : IHttpModule
{
    public void Init(HttpApplication context)
    {
        context.PreRequestHandlerExecute += new EventHandler(OnPreRequestHandlerExecute);
    }

    public void Dispose() {}

    private void OnPreRequestHandlerExecute(object sender, EventArgs e)
    {
        // Get the user (though the method below is probably incorrect)
        // The basic idea is to get the user record using a user key
        // stored in the session (such as the user id).
        MembershipUser user = Membership.GetUser(Guid.Parse(HttpContext.Current.Session["guid"]));

        // Ensure user is valid
        if (!user.IsApproved)
        {
            HttpContext.Current.Session.Abandon();
            FormsAuthentication.SignOut();
            HttpContext.Current.Response.Redirect("~/Login.aspx?AccountDisabled");
        }
    }
}

これは完全な例ではありません。セッションに保存されているキーを使用してユーザーを取得する方法を調整する必要がありますが、これで開始できます。ユーザーアカウントがまだアクティブであることを確認するために、ページの読み込みごとに追加のデータベースチェックが必要になりますが、この情報を確認する他の方法はありません。

27
Mun

フォーム認証を使用する場合:

FormsAuthentication.SignOut();
6
James Santiago

ユーザーをログアウトするときは、FormsAuthenticationTicketを上書きすることもお勧めします。

HttpContext context = HttpContext.Current;

//overwrite the authentication cookie
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, context.User.Identity.Name, DateTime.Now, DateTime.Now.AddDays(-1), false, Guid.NewGuid().ToString());
string encrypted_ticket = FormsAuthentication.Encrypt(ticket);

HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encrypted_ticket);
cookie.Expires = ticket.Expiration;
context.Response.Cookies.Add(cookie);

//clear all the sessions
context.Session.Abandon();

//sign out and go to the login page
FormsAuthentication.SignOut();
FormsAuthentication.RedirectToLoginPage();
5
VDWWD

いくつかの一般的なページで、アカウントが有効であることを確認し、アカウントが取り消されている場合は、Session.Abandon()を呼び出します。

編集(これがまだ開いていることに気づきました。)

私はそれをしているので、これがうまくいくことを知っています。

マスターページで、アカウントのステータスを確認します。つまり、すべてのナビゲーションでログアウトする機会があります。

(最終)編集

「私は彼らのセッションを終了している」とは考えないでください。「彼らのセッションはそれ自体で終了している」と考えてください。

1
egrunin