2017-02-27 4 views
0

Ich habe am Freitag this question gepostet, weil ich nicht herausfinden konnte, warum meine E-Mail nicht verschickt wurde. Heute, in einem Versuch, ein wenig tiefer zu graben, habe ich einige Breakpoints in meiner forgotpassword Methode eingerichtet. Ich habe festgestellt, dass die user Variable Null zurückgibt, aber ich bin nicht ganz sicher warum?Warum gibt mein Benutzer null zurück?

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); 
} 

Die Website speichert E-Mail-Adressen in der Datenbank. Ich schaute auch, um sicherzustellen, dass derjenige, den ich in das Modell einfügte, auch einer war, der von einem Benutzer verwendet wurde, und es gab immer noch Null zurück. Die einzige Sache, die bei der Anmeldung in dieser Anwendung anders ist, ist, dass ich die Anmeldeseite so geändert habe, dass sie Benutzername statt E-Mail verwendet.

+1

Weil 'UserManager.FindByNameAsync()' Null zurückgibt für den Wert, der in 'model.Email' steht. Wenn Sie keine E-Mail verwenden möchten, verweisen Sie nicht auf die E-Mail-Eigenschaft ... –

+0

Aber sollte die E-Mail nicht mit dem Benutzer verknüpft sein? Selbst wenn ich es in Benutzername geändert habe, gibt es immer noch null zurück. – Skullomania

+0

Offensichtlich wird der Benutzer nicht gefunden, wenn er mit seiner E-Mail nach Namen sucht. Sehen Sie sich die Benutzer-/Login-Infotabelle in der Datenbank an. Schau dir an, was in Name gespeichert ist. Sehen Sie sich an, was sich in der Eigenschaft E-Mail befindet. Passen sie zusammen? Nee. Das ist keine Magie, es kann deine Absicht nicht automatisch herausfinden. – Will

Antwort

1

Es ist kein Material online, um ein Passwort-Token mit UserManager zu erstellen. Für jeden, der dieses Problem in der Zukunft hat, ist das so gelöst.

1.) Erstellen Sie einen neuen Ordner mit dem Namen MyClasses und erstellen und fügen Sie die folgende Klasse

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.) Konfigurieren Sie Ihre Identität Klasse

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.) Fügen Sie Ihre Anmeldeinformationen zur web.config hinzu. Ich habe Google Mail in diesem Teil nicht verwendet, da die Verwendung von Google Mail an meinem Arbeitsplatz blockiert ist und immer noch einwandfrei funktioniert.

<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.) Nehmen Sie die erforderlichen Änderungen an Ihrem Konto-Controller. Fügen Sie den folgenden hervorgehobenen Code hinzu.

First do this

Then This

Compile dann laufen. Prost!

Verwandte Themen