2

ASPサイトで「Rememberme」オプションを作成しましたが、クライアントは、「logout」を押した後でも、ユーザーフィールドにログイン名を表示したいと言っていました。別のログイン名を二度と使用しない限り、これは機能します。コードビハインドのテキストボックスに値を割り当てると、手動で新しい値を入力した場合でも、古い値が使用されます。

例:

  1. ユーザー/パスワード(例:User1)を入力し、[Remember me]をクリックして、正常にログインします。
  2. ログアウトすると、ログインページにリダイレクトされます。page_loadイベントで、ユーザー名が保存された有効なCookie(User1)があることを検出し、値を読み取ってテキストフィールドを設定します。
  3. ログインを他の何か(例:User2)に変更しましたが、無効なユーザー/パスワードを表示できません。変。
  4. データを確認しましたが、古いテキストフィールド(User1)を使用しています。別の(例:User3)を試し、ログインを押します。失敗し、Textプロパティを確認すると、画面上ではUser3と表示されていても、User1と表示されます。

コードビハインドファイルに設定すると、何をしても変更されません。一度テキストフィールドを設定すると、変更できないようになります。これは正しくありませんが、私にはそれについての良い説明がありません。

問題のコードは次のとおりです。

ページの読み込み:

protected void Page_Load(object sender, EventArgs e)
{

    if (Request.ServerVariables["AUTH_USER"] != null && !Request.ServerVariables["AUTH_USER"].Equals(""))
    {
        login.Visible = false;
        logout.Visible = true;

        btnLogout.Text = "Logout " + Request.ServerVariables["AUTH_USER"];
    }
    else
    {
        login.Visible = true;
        logout.Visible = false;


        CheckLoginCookie();           
    }

}

Cookieを設定するコード:

private void SaveLoginCookie()
    {
        try
        {

            Response.Cookies["KYSUSR"].Value = txtLoginUsername.Text.Trim();
            Response.Cookies["KYSUSR"].Expires = DateTime.Today.AddMonths(6);

        }
        catch (Exception ex)
        {
            ExceptionHandling.SendErrorReport(this, ex);
        }
    }

Cookieをロードするコード:

   private void CheckLoginCookie()
    {
        try
        {            
            if (Request.Browser.Cookies)
            {
                if (Request.Cookies["KYSUSR"] != null && Request.Cookies["KSYFOR"] != null)
                {
                    // logged in as remember
                    if (Request.Cookies["KYSFOR"].Value == "R")
                        txtLoginUsername.Text = Request.Cookies["KYSUSR"].Value;
                    // once set here, the Text property never changes regardless of what is entered into it

                }                
            }            
        }
        catch (Exception ex)
        {
            ExceptionHandling.SendErrorReport(this, ex);
        }
    }

ログインを行うためのコード:

protected void btnLogin_Click(object sender, EventArgs e)
    {
        try
        {
            String user = txtLoginUsername.Text.Trim();

            if (chkSaveUser.Checked)
                SaveLoginCookie();
            else
            {
                // set cookie as expired so browser will clear it
                Response.Cookies["KYSUSR"].Expires = DateTime.Today.AddDays(-1);                
            }

            if (CheckLogin(user, txtLoginPassword.Text))
            {
                if (chkSaveUser.Checked)
                {                    
                    FormsAuthentication.SetAuthCookie(user, true);                    
                }

                FormsAuthentication.RedirectFromLoginPage(txtLoginUsername.Text.Trim(), false);
            }
        }
        catch (Exception ex)
        {
            ExceptionHandling.SendErrorReport(this, ex);            
        }
    }

Textプロパティが変更されないのはなぜですか?

4

1 に答える 1

3

問題は、メソッドでポストバックにいるかどうかを確認しないことです。つまり、ユーザーがTextbox にPage_Load何か他のものを入れた場合でも、によってオーバーライドされます。txtLoginUsernameCheckLoginCookie

protected void Page_Load(object sender, EventArgs e)
{

    if (Request.ServerVariables["AUTH_USER"] != null
        && !Request.ServerVariables["AUTH_USER"].Equals(""))
    {
        login.Visible = false;
        logout.Visible = true;

        btnLogout.Text = "Logout " + Request.ServerVariables["AUTH_USER"];
    }
    else
    {
        login.Visible = true;
        logout.Visible = false;

        // Only check the login cookie if we are not dealing with a form submission.
        if (!Page.IsPostBack)
        {
            CheckLoginCookie();
        }
    }
}
于 2012-10-02T18:54:38.300 に答える