2017-02-27 188 views
0

我在週五發佈了this question,因爲我無法弄清楚爲什麼我的電子郵件沒有發送出去。今天,爲了深入探索,我在我的forgotpassword方法中設置了一些斷點。我發現user變量返回null,但我不確定爲什麼?爲什麼我的用戶返回null?

public async Task<ActionResult> ForgotPassword(ForgotPasswordViewModel model) 
{ 
    if (ModelState.IsValid) 
    { 
     var user = await UserManager.FindByNameAsync(model.Email); 
     if (user == null) 
     { 
      // Don't reveal that the user does not exist or is not confirmed 
      return View("ForgotPasswordConfirmation"); 
     } 

     // For more information on how to enable account confirmation and password reset please visit http://go.microsoft.com/fwlink/?LinkID=320771 
     // Send an email with this link 
     string code = await UserManager.GeneratePasswordResetTokenAsync(user.Id); 
     var callbackUrl = Url.Action("ResetPassword", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme); 
     await UserManager.SendEmailAsync(user.Id, "Reset Password", "Please reset your password by clicking <a href=\"" + callbackUrl + "\">here</a>"); 
     return RedirectToAction("ForgotPasswordConfirmation", "Account"); 
    } 

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

該網站的確將電子郵件地址存儲在數據庫中。我還希望確保我放入模型中的一個也是用戶使用的,它仍然返回null。在這個應用程序中登錄的不同之處在於我更改了登錄頁面以使用用戶名而不是電子郵件。

+1

因爲UserManager.FindByNameAsync()對於'model.Email'中的任何值都返回null。如果您不想使用電子郵件,請不要引用電子郵件屬性... –

+0

但是,如果找不到與用戶關聯的電子郵件?即使我將其更改爲用戶名,它仍會返回空值。 – Skullomania

+0

顯然,用姓名搜索電子郵件時找不到用戶。查看數據庫中的用戶/登錄信息表。看看Name中存儲了什麼。查看電子郵件屬性中的內容。他們匹配嗎?不。這不是魔術,它不能自動計算出你的意圖。 – Will

回答

1

沒有關於如何使用UserManager創建密碼令牌的材料。對於將來有這個問題的人來說,這是如何解決的。

1)創建一個名爲MyClasses新文件夾,創建並添加下面的類

public class GmailEmailService:SmtpClient 
{ 
    // Gmail user-name 
    public string UserName { get; set; } 

    public GmailEmailService() : 
     base(ConfigurationManager.AppSettings["GmailHost"], Int32.Parse(ConfigurationManager.AppSettings["GmailPort"])) 
    { 
     //Get values from web.config file: 
     this.UserName = ConfigurationManager.AppSettings["GmailUserName"]; 
     this.EnableSsl = Boolean.Parse(ConfigurationManager.AppSettings["GmailSsl"]); 
     this.UseDefaultCredentials = false; 
     this.Credentials = new System.Net.NetworkCredential(this.UserName, ConfigurationManager.AppSettings["GmailPassword"]); 
    } 
} 

2)配置Identity類

public async Task SendAsync(IdentityMessage message) 
{ 
    MailMessage email = new MailMessage(new MailAddress("[email protected]", "(any subject here)"), 
    new MailAddress(message.Destination)); 
    email.Subject = message.Subject; 
    email.Body = message.Body; 

    email.IsBodyHtml = true; 

    GmailEmailService mailClient = new GmailEmailService(); 
    await mailClient.SendMailAsync(email); 
} 

3)將您的憑據添加到web.config。這部分我沒有使用gmail,因爲gmail的使用在我的工作環境中被阻止,並且仍然完美。

<appSettings> 
    <add key="webpages:Version" value="3.0.0.0" /> 
    <add key="webpages:Enabled" value="false" /> 
    <add key="ClientValidationEnabled" value="true" /> 
    <add key="UnobtrusiveJavaScriptEnabled" value="true" /> 

    <add key="GmailUserName" value="[email protected]"/> 
    <add key="GmailPassword" value="yourPassword"/> 
    <add key="GmailHost" value="yourServer"/> 
    <add key="GmailPort" value="yourPort"/> 
    <add key="GmailSsl" value="chooseTrueOrFalse"/> 
    <!--Smptp Server (confirmations emails)--> 
</appSettings> 

4)對帳戶進行控制必要的修改。添加以下突出顯示的代碼。

First do this

Then This

編譯然後運行。乾杯!