4

ASP.Net Web サイト用のカスタム メンバーシップ プロバイダーを作成しました。

私はデフォルトの Forms.Authentication リダイレクトを使用しています。メソッドに true を渡すだけで、現在のユーザーの「Remember me」を指定できます。

この関数は、ユーザーのログイン資格情報を含む Cookie をローカル マシンに書き込むだけだと思います。

ASP.Net はこの Cookie に何を入れますか? ユーザー名の形式がわかっている場合 (連番など)、誰かがこの Cookie を簡単にコピーして、自分のマシンに配置することで、別のユーザーとしてサイトにアクセスできる可能性はありますか?

さらに、Cookie を持つユーザーの認証を傍受できるようにする必要があります。前回のアカウントへのログインがキャンセルされた可能性があるため、パスワードの変更などが必要になる可能性があるため、認証を傍受するオプションが必要です。それでも問題がない場合は、続行するか、適切なログイン ページにリダイレクトするかを許可します。 .

この 2 点について、ご教示いただければ幸いです。認証を傍受するためにglobal.asaxに何かを入れることができるのでしょうか?

前もって感謝します。

4

2 に答える 2

4

私にとっての解決策は、ブラウザ セッション認証 Cookie (asp.net セッション Cookie と混同しないでください) と永続的なCookie区別することでした。有効期限内に再開。以下は私にとってはうまくいきます:

public void SetAuthenticationCookie(LoginView loginModel)
    {
      if (!loginModel.RememberMe)
      {
        FormsAuthentication.SetAuthCookie(loginModel.Email, false);
        return;
      }
      const int timeout = 2880; // Timeout is in minutes, 525600 = 365 days; 1 day = 1440.
      var ticket = new FormsAuthenticationTicket(loginModel.Email, loginModel.RememberMe, timeout);
      //ticket.
      string encrypted = FormsAuthentication.Encrypt(ticket);
      var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encrypted)
        {
          Expires = System.DateTime.Now.AddMinutes(timeout),
          HttpOnly = true
        };
      HttpContext.Current.Response.Cookies.Add(cookie);
    }
于 2012-10-16T15:18:50.300 に答える
3

FormsAuthentication と MembershipProviders は 2 つの完全に異なるものですが、相互にうまく連携するように作られています。永続的な Cookie ["Remember Me"] を作成した場合は、次回は、現在ログインしているユーザーのインスタンスをMembership.GetUser()返すか、ログインしているユーザーがいない場合に単純に呼び出すことができます。MembershipUsernull

したがって、ユーザーが最初に到着して「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)
    {

    }
}
于 2010-06-25T14:34:37.930 に答える