6

シナリオを機能させるために助けを求めたかっただけですか?PasswordResetTokenを使用してUserNameを取得したい。

これが私のシナリオです。

  1. 私のウェブサイトにパスワードを忘れた場合の機能があり、パスワードを再設定した電子メールでパスワードの変更をユーザーに送信します。
  2. passwordresettoken文字列のみを送信したかったのです。
  3. ユーザーがリンクをクリックしたとき。request ["token"]にクエリを実行してユーザー名を取得し、ユーザーがパスワードと自動ログインを変更できるようにします。

    これは以下の私のコードです:

    public ActionResult ChangePassword()
    {
        ChangePasswordModel model = new ChangePasswordModel();
        string token=string.Empty;
        try
        {
            token = Request["token"].ToString();
            int userId = WebSecurity.GetUserIdFromPasswordResetToken(token);
    
            if (userId > 0)
            {
               //Get the user object by (userid) 
               //???????????????????
               //???????????????????
            }
            else
            {
                throw new Exception("The change password token has expired. Please go to login page and click forgot password again.");
            }
        }
        catch
        {
            model.HasError = true;
            ModelState.AddModelError("", "The change password token has expired. Please go to login page and click forgot password again.");
        }
    
        return View(model);
    }
    

前もって感謝します。

4

2 に答える 2

9

この記事の最後にある注釈を見てください:WebSecurity.GeneratePasswordResetTokenメソッド

便宜上、関連する部分をコピーします。

ユーザーがパスワードを忘れた場合は、新しいパスワードを要求できます。新しいパスワードを入力するには、次の手順を実行します。

  1. ユーザーが自分のメールアドレスを入力できるフィールドを持つパスワードリセットページを作成します。
  2. ユーザーがパスワードリセットページに自分のメールアドレスを入力したら、そのメールアドレスが有効なユーザーであることを確認します。含まれている場合は、GeneratePasswordResetToken(String、Int32)メソッドを呼び出してパスワードリセットトークンを生成します。
  3. サイトの確認ページを指し、リンクのURLのクエリ文字列パラメーターとしてトークンを含むハイパーリンクを作成します。
  4. 電子メールメッセージでユーザーにリンクを送信します。ユーザーが電子メールメッセージを受信すると、リンクをクリックして確認ページを呼び出すことができます。
  5. URLパラメータからトークンを抽出し、ユーザーが新しいパスワードを入力できるようにする確認ページを作成します。
  6. ユーザーが新しいパスワードを送信したら、ResetPassword(String、String)メソッドを呼び出して、パスワードリセットトークンと新しいパスワードを渡します。トークンが有効な場合、パスワードはリセットされます。トークンが有効でない場合(たとえば、トークンの有効期限が切れている場合)、エラーメッセージを表示します。

ハイライトは私のものです。基本的にユーザー名は必要ありません。フレームワークはあなたのためにすべての面倒な作業を行います。

コメントに対応するため、ユーザーを自動的にログインさせることはお勧めしません。手動でログインして、このパスワード変更機能が実際に機能したことを確認し、次回だけではないことを発見しないようにすることをお勧めします。

とにかく、あなたはこれを行うことができます:

SimpleMembershipProvider provider = (SimpleMembershipProvider)Membership.Provider;
string username = provider.GetUserNameFromId(userId);

参照:GetUserNameFromId

于 2013-02-21T03:44:02.937 に答える
1

メソッドはあなたが望むことをすると思いWebSecurity.GetUserIdFromPasswordResetToken(string token)ます。

詳細はこちら

更新

申し訳ありませんが、あなたが既にそのメソッドを使用していたことを知りませんでした...ユーザー名を取得したい場合、Entity Framework のコード ファースト マイグレーションを使用している場合は、次の LINQ 式でユーザー名を取得できます。

string username = yourDbContext.UserProfiles.FirstOrDefault(up=>up.UserId == userId).Username;
于 2013-06-14T17:39:03.927 に答える