1

まず、私は MVC を初めて使用し、MVC 4 のパスワード回復機能を実装しようとしています。ここに投稿されたこの手法を使用してこれを実装しています: ASP .NET MVC2 でパスワード回復を実装するための C# サンプル コードの検索場所

仕組みは理解できましたが、今実装しようとしているヘルパー クラスがありません。私はクラスについて話している: NotificationsHelper.SendPasswordRetrieval(model.Email, this.ControllerContext);

コントローラーのRetrievePasswordアクション コントローラーには、パラメーターPasswordRetrievalModel modelがあります。これは db に接続し、テーマの中でいくつかのプロパティを実装するクラス モデルであると思いますが、これはEmailという文字列プロパティです。これは正しいです?

よりも、NotificationsHelper.SendPasswordRetrieval(model.Email, this.ControllerContext); static クラスは、2 つのパラメーターを持つこの静的メソッドSendPasswordRetrievlaを実装します: model.Emailは、PasswordRetrievalModel モデル クラスの文字列プロパティであるため、これがメールの送信先のユーザー メールになります。2 番目のパラメーターよりもthis.ControllerContextです。SendPasswordRetrievalメソッドに送信される値に含まれるこのパラメーターのポイントは何ですか?

次のようにクラスを実装するよりも:

public static class NotificationsHelper
{
    public static bool SendPasswordRetrieval(string emailAddress, ControllerContext ctx)
    {
        try
        {
            StringBuilder emailMessage = new StringBuilder();

            emailMessage.Append("<br />");
            emailMessage.Append("Hello,");
            emailMessage.Append("You have requested a password recovery.");
            emailMessage.Append("<br />");
            emailMessage.Append("Please click the link below to change your password: <br />");
            emailMessage.Append("<br />");
            emailMessage.Append(string.Format("http://www.example.com/Account/Validate?email={0}&token={1}", emailAddress, "**345982374532453435345**"));
            emailMessage.Append("<br />");

            MailMessage email = new MailMessage();
            email.From = new MailAddress("noreplay@example.com");
            email.To.Add(new MailAddress(emailAddress));
            email.Subject = "domain.com Password Recovery";
            email.Body = emailMessage.ToString();
            email.IsBodyHtml = true;

            SmtpClient smtpServer = new SmtpClient();
            smtpServer.Host = "smtp.gmail.com";
            smtpServer.Port = 587;
            smtpServer.Credentials = new NetworkCredential("username", "password");
            smtpServer.EnableSsl = true;
            smtpServer.Send(email);
            return true;
        }            
        catch (Exception e)
        {
            Trace.WriteLine(String.Format("Failure to send email to {0}.", emailAddress));
            return false;
        }
    }
}

上記のコードでは、URL がフォーマットされている行をリストしましたが、@agrcian が提供したコードを使用してトークンをそこに移動するにはどうすればよいですか? トークンは 2 番目のパラメーターControllerContextから来ていますか? はいの場合、どうすればそこから取得できますか?

4

1 に答える 1

0

usertablename itの新しい列を追加pwdresetTocketします。ユーザーがパスワードのリセットを要求したときに、Guid.NewGuid()そのユーザーの pwdresetTocket フィールドに挿入し、コールバック URL に同じものを追加します。

既存のテーブルに列を追加したくない場合は、新しいテーブルを作成してユーザー テーブルにマップできます。

次に、メソッドは次のようになります。

public static bool SendPasswordRetrieval(string emailAddress, ControllerContext ctx)
    {
        try
        {
            StringBuilder emailMessage = new StringBuilder();
          string token = Guid.NewGuid();
        // call to a method that will update the table with token
        updateUsertablewithResetTocket(tocken);

            emailMessage.Append("<br />");
            emailMessage.Append("Hello,");
            emailMessage.Append("You have requested a password recovery.");
            emailMessage.Append("<br />");
            emailMessage.Append("Please click the link below to change your password: <br />");
            emailMessage.Append("<br />");
            emailMessage.Append(string.Format("http://www.example.com/Account/Validate?email={0}&token={1}", emailAddress, token));
            emailMessage.Append("<br />");

            MailMessage email = new MailMessage();
            email.From = new MailAddress("noreplay@example.com");
            email.To.Add(new MailAddress(emailAddress));
            email.Subject = "domain.com Password Recovery";
            email.Body = emailMessage.ToString();
            email.IsBodyHtml = true;

            SmtpClient smtpServer = new SmtpClient();
            smtpServer.Host = "smtp.gmail.com";
            smtpServer.Port = 587;
            smtpServer.Credentials = new NetworkCredential("username", "password");
            smtpServer.EnableSsl = true;
            smtpServer.Send(email);
            return true;
        }            
        catch (Exception e)
        {
            Trace.WriteLine(String.Format("Failure to send email to {0}.", emailAddress));
            return false;
        }
    }

ユーザーがパスワードをリセットしたら、リセット トークン フィールドを空にします

于 2013-01-08T21:37:37.897 に答える