私のアプリでは、管理者がユーザーアカウントを一時停止/一時停止解除できます。私は次のコードでこれを行います:
MembershipUser user = Membership.GetUser(Guid.Parse(userId));
user.IsApproved = false;
Membership.UpdateUser(user);
上記はユーザーを一時停止するために正常に機能しますが、セッションを取り消すことはありません。その結果、一時停止されたユーザーは、セッションCookieが残っている限り、アプリケーションへのアクセスを維持できます。任意の修正/
セッションの「外部」からセッションを放棄する方法はありません。ページが読み込まれるたびにデータベースを確認する必要があります。アカウントが無効になっている場合は、サインアウトしてください。 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");
}
}
}
これは完全な例ではありません。セッションに保存されているキーを使用してユーザーを取得する方法を調整する必要がありますが、これで開始できます。ユーザーアカウントがまだアクティブであることを確認するために、ページの読み込みごとに追加のデータベースチェックが必要になりますが、この情報を確認する他の方法はありません。
フォーム認証を使用する場合:
FormsAuthentication.SignOut();
ユーザーをログアウトするときは、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();
いくつかの一般的なページで、アカウントが有効であることを確認し、アカウントが取り消されている場合は、Session.Abandon()
を呼び出します。
編集(これがまだ開いていることに気づきました。)
私はそれをしているので、これがうまくいくことを知っています。
マスターページで、アカウントのステータスを確認します。つまり、すべてのナビゲーションでログアウトする機会があります。
(最終)編集
「私は彼らのセッションを終了している」とは考えないでください。「彼らのセッションはそれ自体で終了している」と考えてください。