FormsAuthentication と MembershipProviders は 2 つの完全に異なるものですが、相互にうまく連携するように作られています。永続的な Cookie ["Remember Me"] を作成した場合は、次回は、現在ログインしているユーザーのインスタンスをMembership.GetUser()
返すか、ログインしているユーザーがいない場合に単純に呼び出すことができます。MembershipUser
null
したがって、ユーザーが最初に到着して「Remember Me」で認証するときは、次のように永続的な Cookie を作成する必要があります。
FormsAuthentication.RedirectFromLoginPage(strUserName, true);
ユーザーがログアウトせずに Web ページを離れ、しばらくしてから戻ってくると仮定します。次のように MembershipUser.GetUser() を呼び出すだけで、FormsAuthentication によって書き込まれた永続的な Cookie からユーザーが既にログに記録されているかどうかを確認できます。
MembershipUser someUser = Membership.GetUser();
if(someUser == null)
{
FormsAuthentication.SignOut();
FormsAuthentication.RedirectToLoginPage();
}
else
{
//Take where logged in users go.
}
ログインページ自体またはメインのランディングページでこのチェックを実行して、ユーザーアカウントを傍受して、パスワードを変更する必要があるかどうか、またはあなたの場合のようにアカウントが無効になっているかどうかを確認できます.
編集
これには 2 つの方法があります。
1.) 上記のように、global.asax の Session_Start イベントで認証を確認し、その特定のセッションのすべてのページで使用可能になるセッション キーを設定します。
2.) もう 1 つの方法は、System.Web.UI.Page から継承し、すべての asp.net ページの基本ページ クラスとして機能する共通のアプリケーション全体の共通 PageBase クラスを維持することです。上記のように、共通の PageBase クラスのページ ロードで認証を確認します。この場合、条件付きリダイレクトを慎重に記述する必要があります。これは、共通の PageBase クラスのすべてのページの Page_Load で実行されるため、終わりのない無限のリダイレクトに向かう可能性があるためです。
public class PageBase : System.Web.UI.Page
{
/// <summary>
/// Initializes a new instance of the Page class.
/// </summary>
public Page()
{
this.Load += new EventHandler(this.Page_Load);
}
private void Page_Load(object sender, EventArgs e)
{
try
{
AuthenticateUser();
}
catch
{
//handle the situation gracefully.
}
}
private AuthenticateUser()
{
MembershipUser someUser = Membership.GetUser();
if(someUser == null)
{
FormsAuthentication.SignOut();
FormsAuthentication.RedirectToLoginPage();
}
else
{
//Take where logged in users go.
}
}
}
//in your asp.net page code-behind
public partial class contact : PageBase
{
protected void Page_Load(object sender, EventArgs e)
{
}
}