Freigeben über


Kontobestätigung und Kennwortwiederherstellung mit ASP.NET Identity (C#)

Bevor Sie dieses Tutorial ausführen, sollten Sie zuerst Erstellen einer sicheren ASP.NET MVC 5-Web-App mit Anmeldung, E-Mail-Bestätigung und Kennwortzurücksetzung abschließen. Dieses Tutorial enthält weitere Details und zeigt Ihnen, wie Sie E-Mails für die Bestätigung des lokalen Kontos einrichten und Benutzern das Zurücksetzen ihres vergessenen Kennworts in ASP.NET Identity ermöglichen.

Für ein lokales Benutzerkonto muss der Benutzer ein Kennwort für das Konto erstellen, und dieses Kennwort wird (sicher) in der Web-App gespeichert. ASP.NET Identity unterstützt auch Social Media-Konten, für die der Benutzer kein Kennwort für die App erstellen muss. Social Media-Konten verwenden einen Drittanbieter (z. B. Google, Twitter, Facebook oder Microsoft), um Benutzer zu authentifizieren. In diesem Thema werden folgende Themen behandelt:

Neue Benutzer registrieren ihren E-Mail-Alias, wodurch ein lokales Konto erstellt wird.

Abbildung des Kontoregisterfensters

Wenn Sie die Schaltfläche Registrieren auswählen, wird eine Bestätigungs-E-Mail mit einem Validierungstoken an die E-Mail-Adresse gesendet.

Abbildung der bestätigungsgesendeten E-Mail

Der Benutzer erhält eine E-Mail mit einem Bestätigungstoken für sein Konto.

Abbildung des Bestätigungstokens

Wenn Sie den Link auswählen, wird das Konto bestätigt.

Bild bestätigende E-Mail-Adresse

Kennwortwiederherstellung/Kennwortzurücksetzung

Lokale Benutzer, die ihr Kennwort vergessen, können ein Sicherheitstoken an ihr E-Mail-Konto gesendet werden, mit dem sie ihr Kennwort zurücksetzen können.

Abbildung des Fensters zum Zurücksetzen des vergessenen Kennworts

Der Benutzer erhält bald eine E-Mail mit einem Link, mit dem er sein Kennwort zurücksetzen kann.

Abbildung: E-Mail zum Zurücksetzen des Kennworts
Wenn Sie den Link auswählen, gelangen sie zur Seite Zurücksetzen.

Abbildung des Fensters zum Zurücksetzen des Benutzerkennworts

Wenn Sie die Schaltfläche Zurücksetzen auswählen , wird bestätigt, dass das Kennwort zurückgesetzt wurde.

Abbildung der Bestätigung der Kennwortzurücksetzung

Erstellen einer ASP.NET-Web-App

Beginnen Sie mit der Installation und Ausführung von Visual Studio 2017.

  1. Erstellen Sie ein neues ASP.NET-Webprojekt, und wählen Sie die MVC-Vorlage aus. Web Forms auch ASP.NET Identity unterstützen, sodass Sie ähnliche Schritte in einer Webformular-App ausführen können.

  2. Ändern Sie die Authentifizierung in Einzelne Benutzerkonten.

  3. Führen Sie die App aus, wählen Sie den Link Registrieren aus, und registrieren Sie einen Benutzer. An diesem Punkt erfolgt die einzige Überprüfung für die E-Mail mit dem Attribut [EmailAddress].

  4. Navigieren Sie in Server Explorer zu Datenverbindungen\DefaultConnection\Tables\AspNetUsers, klicken Sie mit der rechten Maustaste, und wählen Sie Tabellendefinition öffnen aus.

    Die folgende Abbildung zeigt das AspNetUsers Schema:

    Abbildung des Schemas

  5. Klicken Sie mit der rechten Maustaste auf die Tabelle AspNetUsers , und wählen Sie Tabellendaten anzeigen aus.

    Abbildung mit Tabellendaten

    An diesem Punkt wurde die E-Mail nicht bestätigt.

Der Standarddatenspeicher für ASP.NET Identity ist Entity Framework. Sie können es jedoch so konfigurieren, dass andere Datenspeicher verwendet und zusätzliche Felder hinzugefügt werden. Weitere Informationen finden Sie im Abschnitt Zusätzliche Ressourcen am Ende dieses Tutorials.

Die OWIN-Startklasse ( Startup.cs ) wird aufgerufen, wenn die App gestartet wird, und ruft die ConfigureAuth -Methode in App_Start\Startup.Auth.cs auf, die die OWIN-Pipeline konfiguriert und ASP.NET Identity initialisiert. Untersuchen Sie die Methode ConfigureAuth. Jeder CreatePerOwinContext Aufruf registriert einen Rückruf (gespeichert in ), der OwinContexteinmal pro Anforderung aufgerufen wird, um eine instance des angegebenen Typs zu erstellen. Sie können einen Haltepunkt im Konstruktor und Create der Methode jedes Typs (ApplicationDbContext, ApplicationUserManager) festlegen und überprüfen, ob sie für jede Anforderung aufgerufen werden. Ein instance von ApplicationDbContext und ApplicationUserManager wird im OWIN-Kontext gespeichert, auf den in der gesamten Anwendung zugegriffen werden kann. ASP.NET Identity wird über Cookie-Middleware in die OWIN-Pipeline eingebunden. Weitere Informationen finden Sie unter Verwaltung der Lebensdauer pro Anforderung für die UserManager-Klasse in ASP.NET Identity.

Wenn Sie Ihr Sicherheitsprofil ändern, wird ein neuer Sicherheitsstempel generiert und im Feld der SecurityStampTabelle AspNetUsers gespeichert. Beachten Sie, dass sich das SecurityStamp Feld vom Sicherheitscookies unterscheidet. Das Sicherheitscooky wird nicht in der AspNetUsers Tabelle (oder an einem anderen Ort in der Identity DB) gespeichert. Das Sicherheitscookiestoken wird mithilfe von DPAPI selbstsigniert und mit den Informationen zur UserId, SecurityStamp Ablaufzeit und erstellt.

Die Cookie-Middleware überprüft das Cookie bei jeder Anforderung. Die SecurityStampValidator -Methode in der Startup -Klasse trifft auf die DATENBANK und überprüft den Sicherheitsstempel regelmäßig, wie mit validateIntervalangegeben. Dies geschieht nur alle 30 Minuten (in unserem Beispiel), es sei denn, Sie ändern Ihr Sicherheitsprofil. Das Intervall von 30 Minuten wurde gewählt, um Die Fahrten zur Datenbank zu minimieren. Weitere Informationen finden Sie in meinem Tutorial zur zweistufigen Authentifizierung .

Gemäß den Kommentaren im Code unterstützt die Methode die UseCookieAuthentication Cookieauthentifizierung. Das SecurityStamp Feld und der zugehörige Code bieten ihrer App eine zusätzliche Sicherheitsebene. Wenn Sie Ihr Kennwort ändern, werden Sie aus dem Browser abgemeldet, mit dem Sie sich angemeldet haben. Die SecurityStampValidator.OnValidateIdentity -Methode ermöglicht es der App, das Sicherheitstoken zu überprüfen, wenn sich der Benutzer anmeldet. Dies wird verwendet, wenn Sie ein Kennwort ändern oder die externe Anmeldung verwenden. Dies ist erforderlich, um sicherzustellen, dass alle mit dem alten Kennwort generierten Token (Cookies) ungültig werden. Wenn Sie im Beispielprojekt das Benutzerkennwort ändern, wird ein neues Token für den Benutzer generiert, alle vorherigen Token werden ungültig, und das SecurityStamp Feld wird aktualisiert.

Mit dem Identitätssystem können Sie Ihre App so konfigurieren, wenn sich das Sicherheitsprofil des Benutzers ändert (z. B. wenn der Benutzer sein Kennwort oder die zugehörige Anmeldung ändert (z. B. über Facebook, Google, Microsoft-Konto usw.), wird der Benutzer von allen Browserinstanzen abgemeldet. Die folgende Abbildung zeigt z. B. die Beispiel-App für einmaliges Anmelden , die es dem Benutzer ermöglicht, sich von allen Browserinstanzen (in diesem Fall IE, Firefox und Chrome) abzumelden, indem er eine Schaltfläche auswählt. Alternativ können Sie sich im Beispiel nur von einem bestimmten Browser instance abmelden.

Abbildung des App-Beispielfensters für einmaliges Abmelden

Die Beispiel-App für einmaliges Anmelden zeigt, wie Sie das Sicherheitstoken mit ASP.NET Identität neu generieren können. Dies ist erforderlich, um sicherzustellen, dass alle mit dem alten Kennwort generierten Token (Cookies) ungültig werden. Dieses Feature bietet eine zusätzliche Sicherheitsebene für Ihre Anwendung. wenn Sie Ihr Kennwort ändern, werden Sie dort abgemeldet, wo Sie sich bei dieser Anwendung angemeldet haben.

Die Datei App_Start\IdentityConfig.cs enthält die ApplicationUserManagerKlassen und EmailServiceSmsService . Die EmailService Klassen und SmsService implementieren jeweils die IIdentityMessageService Schnittstelle, sodass Sie in jeder Klasse über gemeinsame Methoden zum Konfigurieren von E-Mails und SMS verfügen. Obwohl in diesem Tutorial nur gezeigt wird, wie Sie E-Mail-Benachrichtigungen über SendGrid hinzufügen, können Sie E-Mails mithilfe von SMTP und anderen Mechanismen senden.

Die Startup Klasse enthält auch eine Kesselplatte zum Hinzufügen sozialer Anmeldungen (Facebook, Twitter usw.). Weitere Informationen finden Sie in meinem Tutorial MVC 5 App mit Facebook, Twitter, LinkedIn und Google OAuth2 Anmelden .

Untersuchen Sie die ApplicationUserManager Klasse, die die Identitätsinformationen der Benutzer enthält, und konfiguriert die folgenden Features:

  • Anforderungen an die Kennwortstärke.
  • Benutzer sperren (Versuche und Zeit).
  • Zweistufige Authentifizierung (2FA). Ich werde 2FA und SMS in einem anderen Tutorial behandeln.
  • Einbinden der E-Mail- und SMS-Dienste. (Ich werde sms in einem anderen Tutorial behandeln).)

Die ApplicationUserManager -Klasse wird von der generischen UserManager<ApplicationUser> Klasse abgeleitet. ApplicationUser wird von IdentityUser abgeleitet. IdentityUser leitet von der generischen IdentityUser Klasse ab:

//     Default EntityFramework IUser implementation
public class IdentityUser<TKey, TLogin, TRole, TClaim> : IUser<TKey>
   where TLogin : IdentityUserLogin<TKey>
   where TRole : IdentityUserRole<TKey>
   where TClaim : IdentityUserClaim<TKey>
{
   public IdentityUser()
   {
      Claims = new List<TClaim>();
      Roles = new List<TRole>();
      Logins = new List<TLogin>();
   }

   ///     User ID (Primary Key)
   public virtual TKey Id { get; set; }

   public virtual string Email { get; set; }
   public virtual bool EmailConfirmed { get; set; }

   public virtual string PasswordHash { get; set; }

   ///     A random value that should change whenever a users credentials have changed (password changed, login removed)
   public virtual string SecurityStamp { get; set; }

   public virtual string PhoneNumber { get; set; }
   public virtual bool PhoneNumberConfirmed { get; set; }

   public virtual bool TwoFactorEnabled { get; set; }

   ///     DateTime in UTC when lockout ends, any time in the past is considered not locked out.
   public virtual DateTime? LockoutEndDateUtc { get; set; }

   public virtual bool LockoutEnabled { get; set; }

   ///     Used to record failures for the purposes of lockout
   public virtual int AccessFailedCount { get; set; }
   
   ///     Navigation property for user roles
   public virtual ICollection<TRole> Roles { get; private set; }

   ///     Navigation property for user claims
   public virtual ICollection<TClaim> Claims { get; private set; }

   ///     Navigation property for user logins
   public virtual ICollection<TLogin> Logins { get; private set; }
   
   public virtual string UserName { get; set; }
}

Die oben genannten Eigenschaften stimmen mit den oben dargestellten Eigenschaften in der AspNetUsers Tabelle überein.

Mit generischen Argumenten für IUser können Sie eine Klasse mit verschiedenen Typen für den Primärschlüssel ableiten. Sehen Sie sich das ChangePK-Beispiel an, das zeigt, wie Sie den Primärschlüssel von Zeichenfolge in int oder GUID ändern.

ApplicationUser

ApplicationUser (public class ApplicationUserManager : UserManager<ApplicationUser>) wird in Models\IdentityModels.cs wie folgt definiert:

public class ApplicationUser : IdentityUser
{
    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(
        UserManager<ApplicationUser> manager)
    {
        // Note the authenticationType must match the one defined in 
       //   CookieAuthenticationOptions.AuthenticationType
        var userIdentity = await manager.CreateIdentityAsync(this, 
    DefaultAuthenticationTypes.ApplicationCookie);
        // Add custom user claims here
        return userIdentity;
    }
}

Der oben hervorgehobene Code generiert eine ClaimsIdentity. ASP.NET Identity und OWIN Cookie Authentication anspruchsbasiert sind, erfordert das Framework daher, dass die App eine ClaimsIdentity für den Benutzer generiert. ClaimsIdentity verfügt über Informationen über alle Ansprüche für den Benutzer, z. B. den Namen des Benutzers, das Alter und die Rollen, zu der der Benutzer gehört. Sie können in dieser Phase auch weitere Ansprüche für den Benutzer hinzufügen.

Die OWIN-Methode AuthenticationManager.SignIn übergibt die ClaimsIdentity und meldet den Benutzer an:

private async Task SignInAsync(ApplicationUser user, bool isPersistent)
{
    AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie);
    AuthenticationManager.SignIn(new AuthenticationProperties(){
       IsPersistent = isPersistent }, 
       await user.GenerateUserIdentityAsync(UserManager));
}

MVC 5 App mit Facebook, Twitter, LinkedIn und Google OAuth2 Anmeldung zeigt, wie Sie der ApplicationUser Klasse zusätzliche Eigenschaften hinzufügen können.

Email Bestätigung

Es ist eine gute Idee, die E-Mail zu bestätigen, mit der ein neuer Benutzer registriert ist, um sicherzustellen, dass er sich nicht als jemand anderes imitiert (d. a. er hat sich nicht mit der E-Mail einer anderen Person registriert). Angenommen, Sie hätten ein Diskussionsforum und möchten verhindern "bob@example.com" , dass sie sich als "joe@contoso.com"registriert. Ohne E-Mail-Bestätigung "joe@contoso.com" könnte unerwünschte E-Mails von Ihrer App erhalten. Angenommen, Bob hat sich versehentlich als "bib@example.com" registriert und hatte es nicht bemerkt, er wäre nicht in der Lage, die Kennwortwiederherstellung zu verwenden, da die App nicht über seine richtige E-Mail verfügt. Email Bestätigung nur eingeschränkten Schutz vor Bots bietet und keinen Schutz vor bestimmten Spammern bietet, verfügen sie über viele funktionierende E-Mail-Aliase, die sie für die Registrierung verwenden können. Im folgenden Beispiel kann der Benutzer sein Kennwort erst ändern, wenn sein Konto bestätigt wurde (indem er einen Bestätigungslink für das E-Mail-Konto ausgewählt hat, bei dem er sich registriert hat). Sie können diesen Workflow auf andere Szenarien anwenden, z. B. senden Sie einen Link zum Bestätigen und Zurücksetzen des Kennworts für neue Konten, die vom Administrator erstellt wurden, und senden Sie dem Benutzer eine E-Mail, wenn er sein Profil geändert hat usw. In der Regel möchten Sie verhindern, dass neue Benutzer Daten auf Ihrer Website veröffentlichen, bevor sie per E-Mail, SMS oder einem anderen Mechanismus bestätigt wurden.

Erstellen eines umfassenderen Beispiels

In diesem Abschnitt verwenden Sie NuGet, um ein vollständiges Beispiel herunterzuladen, mit dem wir arbeiten werden.

  1. Erstellen Sie ein neues leeres ASP.NET Webprojekt.

  2. Geben Sie in der Paket-Manager-Konsole die folgenden Befehle ein:

    Install-Package SendGrid
    Install-Package -Prerelease Microsoft.AspNet.Identity.Samples
    

    In diesem Tutorial verwenden wir SendGrid zum Senden von E-Mails. Das Identity.Samples Paket installiert den Code, mit dem wir arbeiten werden.

  3. Legen Sie das Projekt so fest, dass SSL verwendet wird.

  4. Testen Sie die Erstellung des lokalen Kontos, indem Sie die App ausführen, den Link Registrieren auswählen und das Registrierungsformular veröffentlichen.

  5. Wählen Sie den Demo-E-Mail-Link aus, der die E-Mail-Bestätigung simuliert.

  6. Entfernen Sie den Bestätigungscode für den Demo-E-Mail-Link aus dem Beispiel (Der ViewBag.Link Code im Kontocontroller. Weitere Informationen finden Sie unter den DisplayEmail Aktionsmethoden und ForgotPasswordConfirmation razor-Ansichten .

Warnung

Wenn Sie eine der Sicherheitseinstellungen in diesem Beispiel ändern, müssen Produktions-Apps einer Sicherheitsüberwachung unterzogen werden, die die vorgenommenen Änderungen explizit aufruft.

Untersuchen des Codes in App_Start\IdentityConfig.cs

Das Beispiel zeigt, wie Sie ein Konto erstellen und es der rolle Admin hinzufügen. Ersetzen Sie die E-Mail im Beispiel durch die E-Mail, die Sie für das Administratorkonto verwenden. Die derzeit einfachste Möglichkeit, ein Administratorkonto zu erstellen, ist programmgesteuert in der Seed -Methode. Wir hoffen, in Zukunft ein Tool zu haben, mit dem Sie Benutzer und Rollen erstellen und verwalten können. Mit dem Beispielcode können Sie Benutzer und Rollen erstellen und verwalten, aber Sie müssen zunächst über ein Administratorkonto verfügen, um die Rollen und Benutzeradministratorseiten auszuführen. In diesem Beispiel wird das Administratorkonto erstellt, wenn die Datenbank seeded wird.

Ändern Sie das Kennwort, und ändern Sie den Namen in ein Konto, in dem Sie E-Mail-Benachrichtigungen erhalten können.

Warnung

Sicherheit: Speichern Sie vertrauliche Daten niemals in Ihrem Quellcode.

Wie bereits erwähnt, fügt der app.CreatePerOwinContext Aufruf in der Startklasse Rückrufe zur Create Methode der App-DB-Inhalte, des Benutzer-Managers und der Rollenverwaltungsklassen hinzu. Die OWIN-Pipeline ruft die Create -Methode für diese Klassen für jede Anforderung auf und speichert den Kontext für jede Klasse. Der Kontocontroller macht den Benutzer-Manager aus dem HTTP-Kontext verfügbar (der den OWIN-Kontext enthält):

public ApplicationUserManager UserManager
{
    get
    {
        return _userManager ?? 
    HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
    }
    private set
    {
        _userManager = value;
    }
}

Wenn ein Benutzer ein lokales Konto registriert, wird die HTTP Post Register -Methode aufgerufen:

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Register(RegisterViewModel model)
{
    if (ModelState.IsValid)
    {
        var user = new ApplicationUser { UserName = model.Email, Email = model.Email };
        var result = await UserManager.CreateAsync(user, model.Password);
        if (result.Succeeded)
        {
            var code = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id);
            var callbackUrl = Url.Action(
               "ConfirmEmail", "Account", 
               new { userId = user.Id, code = code }, 
               protocol: Request.Url.Scheme);

            await UserManager.SendEmailAsync(user.Id, 
               "Confirm your account", 
               "Please confirm your account by clicking this link: <a href=\"" 
                                               + callbackUrl + "\">link</a>");
            // ViewBag.Link = callbackUrl;   // Used only for initial demo.
            return View("DisplayEmail");
        }
        AddErrors(result);
    }

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

Der obige Code verwendet die Modelldaten, um mithilfe der eingegebenen E-Mail-Adresse und des Kennworts ein neues Benutzerkonto zu erstellen. Wenn sich der E-Mail-Alias im Datenspeicher befindet, schlägt die Kontoerstellung fehl, und das Formular wird erneut angezeigt. Die GenerateEmailConfirmationTokenAsync -Methode erstellt ein sicheres Bestätigungstoken und speichert es im ASP.NET Identity-Datenspeicher. Die Url.Action-Methode erstellt einen Link, der das UserId Bestätigungstoken und enthält. Dieser Link wird dann per E-Mail an den Benutzer gesendet. Der Benutzer kann den Link in seiner E-Mail-App auswählen, um sein Konto zu bestätigen.

Einrichten der E-Mail-Bestätigung

Wechseln Sie zur SendGrid-Registrierungsseite, und registrieren Sie sich für ein kostenloses Konto. Fügen Sie Code ähnlich dem folgenden hinzu, um SendGrid zu konfigurieren:

public class EmailService : IIdentityMessageService
{
   public Task SendAsync(IdentityMessage message)
   {
      return configSendGridasync(message);
   }

   private Task configSendGridasync(IdentityMessage message)
   {
      var myMessage = new SendGridMessage();
      myMessage.AddTo(message.Destination);
      myMessage.From = new System.Net.Mail.MailAddress(
                          "Joe@contoso.com", "Joe S.");
      myMessage.Subject = message.Subject;
      myMessage.Text = message.Body;
      myMessage.Html = message.Body;

      var credentials = new NetworkCredential(
                 ConfigurationManager.AppSettings["mailAccount"],
                 ConfigurationManager.AppSettings["mailPassword"]
                 );

      // Create a Web transport for sending email.
      var transportWeb = new Web(credentials);

      // Send the email.
      if (transportWeb != null)
      {
         return transportWeb.DeliverAsync(myMessage);
      }
      else
      {
         return Task.FromResult(0);
      }
   }
}

Hinweis

Email Clients akzeptieren häufig nur Textnachrichten (kein HTML). Sie sollten die Nachricht in Text und HTML angeben. Im obigen SendGrid-Beispiel erfolgt dies mit dem oben gezeigten myMessage.Text Code und myMessage.Html .

Der folgende Code zeigt, wie E-Mails mithilfe der MailMessage-Klasse gesendet werden, wobei message.Body nur der Link zurückgegeben wird.

void sendMail(Message message)
{
#region formatter
   string text = string.Format("Please click on this link to {0}: {1}", message.Subject, message.Body);
   string html = "Please confirm your account by clicking this link: <a href=\"" + message.Body + "\">link</a><br/>";

   html += HttpUtility.HtmlEncode(@"Or click on the copy the following link on the browser:" + message.Body);
#endregion

   MailMessage msg = new MailMessage();
   msg.From = new MailAddress("joe@contoso.com");
   msg.To.Add(new MailAddress(message.Destination));
   msg.Subject = message.Subject;
   msg.AlternateViews.Add(AlternateView.CreateAlternateViewFromString(text, null, MediaTypeNames.Text.Plain));
   msg.AlternateViews.Add(AlternateView.CreateAlternateViewFromString(html, null, MediaTypeNames.Text.Html));

   SmtpClient smtpClient = new SmtpClient("smtp.gmail.com", Convert.ToInt32(587));
   System.Net.NetworkCredential credentials = new System.Net.NetworkCredential("joe@contoso.com", "XXXXXX");
   smtpClient.Credentials = credentials;
   smtpClient.EnableSsl = true;
   smtpClient.Send(msg);
}

Warnung

Sicherheit: Speichern Sie vertrauliche Daten niemals in Ihrem Quellcode. Das Konto und die Anmeldeinformationen werden in appSetting gespeichert. In Azure können Sie diese Werte auf der Registerkarte Konfigurieren im Azure-Portal sicher speichern. Weitere Informationen finden Sie unter Bewährte Methoden für die Bereitstellung von Kennwörtern und anderen vertraulichen Daten in ASP.NET und Azure.

Geben Sie Ihre SendGrid-Anmeldeinformationen ein, führen Sie die App aus, registrieren Sie sich mit einem E-Mail-Alias kann den Bestätigungslink in Ihrer E-Mail auswählen. Informationen dazu, wie Sie dies mit Ihrem Outlook.com E-Mail-Konto tun, finden Sie unter John Attens C#-SMTP-Konfiguration für Outlook.Com SMTP-Host und seineASP.NET Identity 2.0: Einrichten der Kontoüberprüfung und Two-Factor Autorisierungsbeiträge .

Sobald ein Benutzer die Schaltfläche Registrieren auswählt, wird eine Bestätigungs-E-Mail mit einem Validierungstoken an seine E-Mail-Adresse gesendet.

Abbildung des Bestätigungsfensters per E-Mail

Der Benutzer erhält eine E-Mail mit einem Bestätigungstoken für sein Konto.

Abbildung der empfangenen E-Mail

Untersuchen des Codes

Der folgende Code veranschaulicht die POST ForgotPassword-Methode.

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

        var 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 here: <a href=\"" + callbackUrl + "\">link</a>");        
        return View("ForgotPasswordConfirmation");
    }

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

Die Methode schlägt im Hintergrund fehl, wenn die Benutzer-E-Mail nicht bestätigt wurde. Wenn ein Fehler für eine ungültige E-Mail-Adresse gepostet wurde, können böswillige Benutzer diese Informationen verwenden, um gültige UserId (E-Mail-Aliase) für Angriffe zu finden.

Der folgende Code zeigt die ConfirmEmail -Methode im Kontocontroller, die aufgerufen wird, wenn der Benutzer den Bestätigungslink in der an ihn gesendeten E-Mail auswählt:

public async Task<ActionResult> ConfirmEmail(string userId, string code)
{
    if (userId == null || code == null)
    {
        return View("Error");
    }
    var result = await UserManager.ConfirmEmailAsync(userId, code);
    if (result.Succeeded)
    {
        return View("ConfirmEmail");
    }
    AddErrors(result);
    return View();
}

Sobald ein vergessenes Kennworttoken verwendet wurde, wird es ungültig. Die folgende Codeänderung in der Create -Methode (in der Datei App_Start\IdentityConfig.cs ) legt fest, dass die Token in drei Stunden ablaufen.

if (dataProtectionProvider != null)
 {
    manager.UserTokenProvider =
       new DataProtectorTokenProvider<ApplicationUser>
          (dataProtectionProvider.Create("ASP.NET Identity"))
          {                    
             TokenLifespan = TimeSpan.FromHours(3)
          };
 }

Mit dem obigen Code laufen das vergessene Kennwort und die E-Mail-Bestätigungstoken in drei Stunden ab. Der Standardwert TokenLifespan ist ein Tag.

Der folgende Code zeigt die E-Mail-Bestätigungsmethode:

// GET: /Account/ConfirmEmail
[AllowAnonymous]
public async Task<ActionResult> ConfirmEmail(string userId, string code)
{
   if (userId == null || code == null)
   {
      return View("Error");
   }
   IdentityResult result;
   try
   {
      result = await UserManager.ConfirmEmailAsync(userId, code);
   }
   catch (InvalidOperationException ioe)
   {
      // ConfirmEmailAsync throws when the userId is not found.
      ViewBag.errorMessage = ioe.Message;
      return View("Error");
   }

   if (result.Succeeded)
   {
      return View();
   }

   // If we got this far, something failed.
   AddErrors(result);
   ViewBag.errorMessage = "ConfirmEmail failed";
   return View("Error");
}

Um Ihre App sicherer zu machen, unterstützt ASP.NET Identity Two-Factor-Authentifizierung (2FA). Weitere Informationen finden Sie unter ASP.NET Identity 2.0: Einrichten der Kontoüberprüfung und Two-Factor Autorisierung durch John Atten. Sie können zwar die Kontosperrung bei Fehlern bei Anmeldekennwortversuchen festlegen, aber dieser Ansatz macht Ihre Anmeldung anfällig für DOS-Sperren . Es wird empfohlen, die Kontosperrung nur mit 2FA zu verwenden.

Zusätzliche Ressourcen