10

最初のログイン後に、ユーザーにパスワードの変更を強制したいと思います。さて、リダイレクトコードをChangePasswordページのどこに置くべきですか?

  • デフォルトページに入れると、認証Page_Loadされているのでどのページにも移動できます。
  • マスターページに配置するとPage_Load、ChangePasswordページは同じマスターページを使用し、リダイレクトの無限ループに入ります。

    PageがマスターページのChagePasswordページである場合、リダイレクトを無視しましたが、次のような答えが見つかりました。

    これは最初から悪い考えのように聞こえます。マスターの考え方は、これは各ページに共通のコードであるため、どのページが存在するかを気にする必要はないということです。

なにか提案を!

4

9 に答える 9

5

ここに、完全にテストされたソリューションがあります;)

protected void LoginButton_Click(object sender, EventArgs e)
{
    /****note: UserName and Password are textbox fields****/

    if (Membership.ValidateUser(UserName.Text, Password.Text))
    {
        MembershipUser user = Membership.GetUser(UserName.Text);
        if (user == null)
        {
           FailureText.Text = "Invalid username. Please try again.";
           return;
        }
        if (user.IsLockedOut)
           user.UnlockUser();

        /* this is the interesting part for you */
        if (user.LastPasswordChangedDate == user.CreationDate) //if true, that means user never changed their password before
        {
            //TODO: add your change password logic here
        }
    }
}
于 2012-05-19T22:57:56.123 に答える
1

GLobal.asaxファイルでそれを行うことができます。

ログインしているユーザーとリクエストURLがChangePasswordでないかどうかを確認してから、パスワードの変更ページにリダイレクトします。

/// <summary>
/// this event occurs just after user is authenticated
/// </summary>
void Application_AuthorizeRequest(object sender, EventArgs e)
{
    // check if user is authenticated
    if (User.Identity.IsAuthenticated)
    {
        // checking page extension
        switch (System.IO.Path.GetExtension(Context.Request.Url.AbsoluteUri.ToLower()))
        {
            case ".bmp":
            case ".gif":
            case ".jpg":
            case ".jpe":
            case ".jpeg":
            case ".png":
            case ".css":
            case ".js":
            case ".txt":
            case ".swf":
                // don't redirect, these requests may required in many cases
                break;
            default:
                // checking if request is not for ChangePassword.aspx page
                if (!Context.Request.Url.AbsoluteUri.ToLower().Contains("/changepassword.aspx"))
                {
                    Context.Response.Redirect("~/ChangePassword.aspx");
                }
                break;
        }
    }
}
于 2011-03-12T10:36:32.097 に答える
1

同様の要件を持つアプリがありました。基本 ASP.NET メンバーシップ プロバイダーを拡張して、LastPasswordChangedDate をチェックし、それを CreateDate と比較できるようにしました。等しい場合、ユーザーがパスワードを変更したことがなく、ログイン ページにリダイレクトされたことを意味します。

ログイン後もバグを発生させ続けるために、何らかのチェックが必要なようです。これは、Global.asax の AuthorizationRequest で実現できると思います。それは高価かもしれませんが。

于 2011-03-23T00:36:01.450 に答える
0

ユーザーが最初のログイン時にパスワードを変更するようにしたいので、登録後、データベースのログインテーブルにもう1つのフィールドを作成します。このフィールドには、最初のパスワード変更プロセスが完了したかどうかのステータス値があります。したがって、ユーザーが初めてログインするときに、その値がチェックされ、「変更なし」のようなものである場合は、ユーザーをログインページからパスワードの変更ページにリダイレクトします。パスワードが正常に変更されたら、フィールドを更新します。

于 2011-04-05T14:17:47.700 に答える
0

ユーザーが認証されているかどうかを評価するために、どのオブジェクトをセクションに入れていますか? 「ChangePasswordOnNextLoggin」という名前のブール値のプロパティを設定するだけです。それが true の場合は、「ChangePassword.aspx」にリダイレクトします。このプロパティが true の場合にのみリダイレクトするため、マスター ページであっても、必要な場所に配置できます。無限ループ)。

しかし、個人的には、クラスの背後にあるすべての.aspxコードが継承する必要があるPAGEオブジェクトのラッパーを作成し、代わりにこのラッパーを継承し、ラッパーctorで、AuthenticateメソッドをLoadイベントに追加します。ページがロードされたときに呼び出される最初のメソッドになります。これを行うと、MasterPage とコード ビハインドに検証コードを配置することを回避でき、コードがよりクリーンになります。分かりますか?

于 2011-03-18T17:48:41.937 に答える
0

Login コントロールの次のイベントを処理できます。

•ログイン中 •ログイン中

頑張ってください、これがお役に立てば幸いです。

于 2011-03-12T09:59:12.283 に答える
0

ユーザーが認証されるコードの場所。

于 2011-03-31T22:43:30.370 に答える
0

私が理解しているように、検証コードを「Page_PreRender」に入れる必要があります

protected void Page_PreRender(object sender, EventArgs e)
{
     //Validation Code       
}

このイベントは、ページが何かをレンダリングする前にコードを起動します

于 2011-03-17T16:08:40.977 に答える
-2

SQL Server 2005(およびVS2008)では、すべての「フィールドをもう1つ追加する」アプローチを除けば、asp.netセキュリティデータベースの組み込みストアドプロシージャを実行する方がはるかに簡単だと思いますaspnet_Membership_FindUsersByName。最終アクティビティ日、最終パスワード変更日、最終ログイン日など、必要なすべての情報と時間値を含むデータセットを返します。

于 2012-01-24T13:47:03.043 に答える