2

在我的MVC和Web API項目我使用ASP.NET身份登錄。忘記密碼與asp.net身份

這是對我的AccountController忘記密碼功能:

[HttpPost] 
    [AllowAnonymous] 
    [Route("ForgotPassword")] 
    public async Task<IHttpActionResult> ForgotPassword(ForgotPasswordViewModel model) 
    { 
     if (ModelState.IsValid) 
     { 
      var user = await UserManager.FindByNameAsync(model.Email); 

      if (user == null || !(await UserManager.IsEmailConfirmedAsync(user.Id))) 
      { 
       return Ok(); 
      } 

      try 
      { 
       var code = await UserManager.GeneratePasswordResetTokenAsync(user.Id); 
       var callbackUrl = new Uri(@"http://MyProject/ResetPassword?userid=" + user.Id + "&code=" + code); 

       string subject = "Reset Password"; 
       string body = "Please reset your password by clicking <a href=\"" + callbackUrl + "\">here</a>"; 
       SendEmail(user.Email, callbackUrl, subject, body); 
      } 

      catch (Exception ex) 
      { 
       throw new Exception(ex.ToString()); 
      } 

      return Ok(); 
     } 

     // If we got this far, something failed, redisplay form 
     return BadRequest(ModelState); 
    } 

我收到確認郵件,我成功地重定向到重置密碼查看,但隨後我不知道如何着手。

如何使用以下參數重置密碼:NewPssword,ConfirmPassword和Code?

對不起,如果這是一個愚蠢的問題,但我有點困惑。

我試圖調用SetPassword方法,但得到了401錯誤。

self.resetPassword = function() { 
    var data = { 
     Email: self.loginUserName(), 
     NewPassword: self.registerPassword(), 
     ConfirmPassword: self.registerPassword2() 
    } 
    $.ajax({ 
     type: 'POST', 
     url: '../API/Account/SetPassword', 
     contentType: 'application/json; charset=utf-8', 
     data: JSON.stringify(data), 
     complete: showError 
    }); 
} 

而且setPassword功能:

// POST api/Account/SetPassword 
    [Route("SetPassword")] 
    public async Task<IHttpActionResult> SetPassword(SetPasswordBindingModel model) 
    { 
     if (!ModelState.IsValid) 
     { 
      return BadRequest(ModelState); 
     } 

     IdentityResult result = await UserManager.AddPasswordAsync(User.Identity.GetUserId(), model.NewPassword); 

     if (!result.Succeeded) 
     { 
      return GetErrorResult(result); 
     } 

     return Ok(); 
    } 

目前,該過程是S-如下: 「忘記密碼」 鏈接

  1. 用戶點擊。
  2. 他被重定向到忘記密碼視圖,該視圖有一個字段:電子郵件。
  3. 用戶提供他的電子郵件地址並提交表單。
  4. 該請求正在發送到忘記密碼功能。
  5. 具有唯一代碼的電子郵件正在發送給客戶端。

到這裏我寫的代碼,並得到它的工作,但我不知道該如何實施的下一步驟:

  • 用戶被重定向重置密碼視圖有3個字段:電子郵件,新密碼和確認密碼。
  • 用戶提交表單,使用唯一代碼將請求發送到SetPassword函數(?),並且用戶的密碼正在成功重置。
  • 在此先感謝。

    回答

    3

    聽起來像你SetPassword API應該叫

    var user = await UserManager.FindByNameAsync(model.Email); 
    if (user != null) 
    { 
        var result = await UserManager.ResetPasswordAsync(user.Id, model.Code, model.NewPassword); 
        if (result.Succeeded) 
        { 
          //handle success 
        } 
    } 
    //handle invalid  
    
    +0

    謝謝您的回答,我不知道你的意思,你就可以解釋一下嗎? – user3378165

    +0

    你必須發佈相關的代碼才能得到確切的答案..你發佈了你所說的'ForgotPassword'動作,但你沒有發佈你說的'SetPassword'動作,你說的是返回一個錯誤..很難通過您發佈的2個片段準確告訴您出了什麼問題。 – JamieD77

    +0

    你是對的,我編輯了我的問題,非常感謝你的幫助! – user3378165