Delen via


Accountbevestiging en wachtwoordherstel met ASP.NET Identiteit (C#)

Voordat u deze zelfstudie uitvoert, moet u eerst Een beveiligde ASP.NET MVC 5-web-app maken met aanmelden, e-mailbevestiging en wachtwoordherstel. Deze zelfstudie bevat meer informatie en laat zien hoe u e-mail kunt instellen voor bevestiging van het lokale account en hoe gebruikers hun vergeten wachtwoord opnieuw kunnen instellen in ASP.NET Identiteit.

Voor een lokaal gebruikersaccount moet de gebruiker een wachtwoord voor het account maken en dat wachtwoord wordt (veilig) opgeslagen in de web-app. ASP.NET Identity ondersteunt ook sociale accounts, waarvoor de gebruiker geen wachtwoord voor de app hoeft te maken. Sociale accounts een derde partij (zoals Google, Twitter, Facebook of Microsoft) gebruiken om gebruikers te verifiëren. In dit onderwerp wordt het volgende behandeld:

Nieuwe gebruikers registreren hun e-mailalias, waarmee een lokaal account wordt gemaakt.

afbeelding van het accountregistervenster

Als u de knop Registreren selecteert, wordt een bevestigingsmail met een validatietoken naar het e-mailadres verzonden.

afbeelding met verzonden e-mailbevestiging

De gebruiker ontvangt een e-mail met een bevestigingstoken voor zijn/haar account.

afbeelding van bevestigingstoken

Als u de koppeling selecteert, wordt het account bevestigd.

afbeelding ter bevestiging van het e-mailadres

Wachtwoordherstel/opnieuw instellen

Lokale gebruikers die hun wachtwoord vergeten, kunnen een beveiligingstoken laten verzenden naar hun e-mailaccount, zodat ze hun wachtwoord opnieuw kunnen instellen.

afbeelding van het venster wachtwoordherstel vergeten

De gebruiker ontvangt binnenkort een e-mail met een koppeling waarmee hij of zij het wachtwoord opnieuw kan instellen.

afbeelding waarin het e-mailadres voor wachtwoord opnieuw instellen wordt weergegeven
Als u de koppeling selecteert, worden ze naar de pagina Opnieuw instellen geleid.

afbeelding met het venster voor het opnieuw instellen van gebruikerswachtwoorden

Als u de knop Opnieuw instellen selecteert, wordt bevestigd dat het wachtwoord opnieuw is ingesteld.

afbeelding met bevestiging voor wachtwoordherstel

Een ASP.NET-web-app maken

Begin met het installeren en uitvoeren van Visual Studio 2017.

  1. Maak een nieuw ASP.NET-webproject en selecteer de MVC-sjabloon. Web Forms biedt ook ondersteuning voor ASP.NET Identiteit, zodat u vergelijkbare stappen in een webformulier-app kunt volgen.

  2. Wijzig de verificatie in afzonderlijke gebruikersaccounts.

  3. Voer de app uit, selecteer de koppeling Registreren en registreer een gebruiker. Op dit moment vindt de enige validatie op de e-mail plaats met het [EmailAddress] kenmerk.

  4. Navigeer in Server Explorer naar Gegevensverbindingen\DefaultConnection\Tables\AspNetUsers, klik met de rechtermuisknop en selecteer Tabeldefinitie openen.

    In de volgende afbeelding ziet u het AspNetUsers schema:

    Afbeelding die het schema van ASP.NET Gebruikers toont

  5. Klik met de rechtermuisknop op de tabel AspNetUsers en selecteer Tabelgegevens weergeven.

    afbeelding met tabelgegevens

    Op dit moment is het e-mailbericht niet bevestigd.

Het standaardgegevensarchief voor ASP.NET Identity is Entity Framework, maar u kunt dit configureren voor het gebruik van andere gegevensarchieven en voor het toevoegen van extra velden. Zie sectie Aanvullende Bronnen aan het einde van deze handleiding.

De OWIN-opstartklasse (Startup.cs) wordt aangeroepen wanneer de app wordt gestart en de methode ConfigureAuth aanroept in App_Start\Startup.Auth.cs, waarmee de OWIN-pijplijn wordt geconfigureerd en ASP.NET Identiteit wordt geïnitialiseerd. Bekijk de methode ConfigureAuth. Elke CreatePerOwinContext-aanroep registreert een callback (opgeslagen in de OwinContext) die eenmaal per aanvraag wordt aangeroepen om een exemplaar van het opgegeven type te maken. U kunt een onderbrekingspunt instellen in de constructor en Create methode van elk type (ApplicationDbContext, ApplicationUserManager) en controleren of ze voor elke aanvraag worden aangeroepen. Een exemplaar van ApplicationDbContext en ApplicationUserManager wordt opgeslagen in de OWIN-context, die overal in de toepassing toegankelijk is. ASP.NET Identity koppelt zich aan de OWIN-pijplijn via cookie-middleware. Zie Levensduurbeheer per aanvraag voor de klasse UserManager in ASP.NET Identityvoor meer informatie.

Wanneer u uw beveiligingsprofiel wijzigt, wordt er een nieuw beveiligingsstempel gegenereerd en opgeslagen in het SecurityStamp veld van de AspNetUsers tabel. Het SecurityStamp-veld is anders dan de beveiligingscookie. De beveiligingscookis wordt niet opgeslagen in de AspNetUsers tabel (of ergens anders in de identiteitsdatabase). Het cookietoken voor beveiliging is zelfondertekend met DPAPI- en wordt gemaakt met de UserId, SecurityStamp- en verlooptijdgegevens.

De cookie-middleware controleert de cookie op elke aanvraag. De methode SecurityStampValidator in de Startup klasse benadert de database en controleert periodiek het beveiligingsstempel, volgens de specificaties van validateInterval. Dit gebeurt slechts om de 30 minuten (in ons voorbeeld) tenzij u uw beveiligingsprofiel wijzigt. Het interval van 30 minuten is gekozen om de ritten naar de database te minimaliseren. Zie mijn zelfstudie over twee-factorenauthenticatie voor meer details.

Volgens de opmerkingen in de code ondersteunt de UseCookieAuthentication methode cookieverificatie. Het SecurityStamp veld en de bijbehorende code biedt een extra beveiligingslaag voor uw app, wanneer u uw wachtwoord wijzigt, wordt u afgemeld bij de browser waarmee u bent aangemeld. Met de SecurityStampValidator.OnValidateIdentity methode kan de app het beveiligingstoken valideren wanneer de gebruiker zich aanmeldt, dat wordt gebruikt wanneer u een wachtwoord wijzigt of de externe aanmelding gebruikt. Dit is nodig om ervoor te zorgen dat tokens (cookies) die met het oude wachtwoord zijn gegenereerd, ongeldig zijn. Als u in het voorbeeldproject het gebruikerswachtwoord wijzigt, wordt er een nieuw token gegenereerd voor de gebruiker, worden eventuele eerdere tokens ongeldig gemaakt en wordt het SecurityStamp veld bijgewerkt.

Met het identiteitssysteem kunt u uw app configureren, dus wanneer het beveiligingsprofiel van de gebruiker wordt gewijzigd (bijvoorbeeld wanneer de gebruiker het wachtwoord wijzigt of de bijbehorende aanmelding wijzigt (zoals van Facebook, Google, Microsoft-account, enzovoort), wordt de gebruiker afgemeld bij alle browserexemplaren. In de onderstaande afbeelding ziet u bijvoorbeeld het voorbeeld van eenmalige afmelding app, waarmee de gebruiker zich kan afmelden bij alle browserexemplaren (in dit geval IE, Firefox en Chrome) door op één knop te drukken. Met het voorbeeld kunt u zich alleen afmelden bij een specifiek browserexemplaar.

Afbeelding met het voorbeeldvenster van de app voor eenmalige afmelding

In het voorbeeld van eenmalige aanmelding app ziet u hoe u met ASP.NET Identity het beveiligingstoken opnieuw kunt genereren. Dit is nodig om ervoor te zorgen dat tokens (cookies) die met het oude wachtwoord zijn gegenereerd, ongeldig zijn. Deze functie biedt een extra beveiligingslaag voor uw toepassing; wanneer u uw wachtwoord wijzigt, wordt u afgemeld waar u zich hebt aangemeld bij deze toepassing.

Het bestand App_Start\IdentityConfig.cs bevat de klassen ApplicationUserManager, EmailService en SmsService. De EmailService- en SmsService klassen implementeren de IIdentityMessageService interface, zodat u in elke klasse algemene methoden hebt om e-mail en sms te configureren. Hoewel deze zelfstudie alleen laat zien hoe u e-mailmeldingen toevoegt via SendGrid, kunt u e-mail verzenden met BEHULP van SMTP en andere mechanismen.

De Startup klasse bevat ook boilerplaat om sociale aanmeldingen toe te voegen (Facebook, Twitter, enzovoort), zie mijn zelfstudie MVC 5-app met Facebook, Twitter, LinkedIn en Google OAuth2-aanmelding voor meer informatie.

Bekijk de ApplicationUserManager-klasse, die de identiteitsgegevens van de gebruikers bevat en configureert de volgende functies:

  • Vereisten voor wachtwoordsterkte.
  • Gebruikersvergrendeling (pogingen en tijd).
  • Tweeledige verificatie (2FA). Ik ga 2FA en SMS in een andere tutorial behandelen.
  • De e-mail- en sms-services koppelen. (Ik behandel SMS in een andere tutorial).

De ApplicationUserManager klasse is afgeleid van de algemene UserManager<ApplicationUser> klasse. ApplicationUser is afgeleid van IdentityUser. IdentityUser is afgeleid van de algemene IdentityUser klasse:

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

De bovenstaande eigenschappen vallen samen met de eigenschappen in de AspNetUsers tabel, zoals hierboven wordt weergegeven.

Met algemene argumenten voor IUser kunt u een klasse afleiden met behulp van verschillende typen voor de primaire sleutel. Zie het voorbeeld ChangePK dat laat zien hoe u de primaire sleutel wijzigt van een tekenreeks naar een int of GUID.

ApplicationUser

ApplicationUser (public class ApplicationUserManager : UserManager<ApplicationUser>) wordt gedefinieerd in Models\IdentityModels.cs als:

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

Met de gemarkeerde code hierboven wordt een ClaimsIdentity-gegenereerd. ASP.NET identiteit en OWIN-cookieverificatie zijn gebaseerd op claims, daarom vereist het framework dat de app een ClaimsIdentity voor de gebruiker genereert. ClaimsIdentity bevat informatie over alle claims voor de gebruiker, zoals de naam van de gebruiker, leeftijd en de rollen waartoe de gebruiker behoort. U kunt in deze fase ook meer claims voor de gebruiker toevoegen.

De methode OWIN AuthenticationManager.SignIn geeft ClaimsIdentity door en meldt de gebruiker aan.

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 met Facebook, Twitter, LinkedIn en Google OAuth2-aanmelding laat zien hoe u extra eigenschappen aan de ApplicationUser-klasse kunt toevoegen.

E-mailbevestiging

Het is een goed idee om het e-mailbericht te bevestigen waarmee een nieuwe gebruiker zich registreert om te controleren of hij of zij geen iemand anders imiteert (dat wil gezegd, hij of zij zich niet heeft geregistreerd bij het e-mailadres van iemand anders). Stel dat u een discussieforum had, wilt u voorkomen dat "bob@example.com" zich registreert als "joe@contoso.com". Zonder e-mailbevestiging kan "joe@contoso.com" ongewenste e-mail uit uw app ontvangen. Stel dat Bob per ongeluk is geregistreerd als "bib@example.com" en deze niet had opgemerkt, hij niet in staat zou zijn om wachtwoordherstel te gebruiken omdat de app niet over zijn juiste e-mail beschikt. E-mailbevestiging biedt slechts beperkte bescherming tegen bots en biedt geen bescherming tegen bepaalde spammers, ze hebben veel werkende e-mailaliassen die ze kunnen gebruiken om te registreren. In het onderstaande voorbeeld kan de gebruiker het wachtwoord pas wijzigen nadat het account is bevestigd (door een bevestigingskoppeling te selecteren die is ontvangen op het e-mailaccount waarmee hij of zij zich heeft geregistreerd.) U kunt deze werkstroom toepassen op andere scenario's, bijvoorbeeld het verzenden van een koppeling om het wachtwoord te bevestigen en opnieuw in te stellen voor nieuwe accounts die door de beheerder zijn gemaakt, de gebruiker een e-mail sturen wanneer ze hun profiel hebben gewijzigd, enzovoort. Over het algemeen wilt u voorkomen dat nieuwe gebruikers gegevens op uw website plaatsen voordat ze per e-mail, sms-bericht of een ander mechanisme zijn bevestigd.

Een completer voorbeeld maken

In deze sectie gebruikt u NuGet om een completer voorbeeld te downloaden waarmee we werken.

  1. Maak een nieuw leeg ASP.NET Web-project.

  2. Voer in de Package Manager-console de volgende opdrachten in:

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

    In deze zelfstudie gebruiken we SendGrid- om e-mail te verzenden. Het Identity.Samples-pakket installeert de code waarmee we gaan werken.

  3. Stel het project in om SSL-te gebruiken.

  4. Test het maken van een lokaal account door de app uit te voeren, de koppeling Registreren te selecteren en het registratieformulier te plaatsen.

  5. Selecteer de demo-e-mailkoppeling, waarmee e-mailbevestiging wordt gesimuleerd.

  6. Verwijder de bevestigingscode voor de demo-e-mailkoppeling uit het voorbeeld (de ViewBag.Link code in de accountcontroller. Zie de DisplayEmail en ForgotPasswordConfirmation actiemethoden en scheermesweergaven).

Waarschuwing

Als u een van de beveiligingsinstellingen in dit voorbeeld wijzigt, moeten productie-apps een beveiligingscontrole ondergaan die expliciet de aangebrachte wijzigingen aanroept.

Bekijk de code in App_Start\IdentityConfig.cs

In het voorbeeld ziet u hoe u een account maakt en dit toevoegt aan de rol Admin. Vervang het e-mailbericht in het voorbeeld door de e-mail die u gaat gebruiken voor het beheerdersaccount. De eenvoudigste manier om nu een beheerdersaccount te maken, is programmatisch in de methode Seed. We hopen in de toekomst een hulpprogramma te hebben waarmee u gebruikers en rollen kunt maken en beheren. Met de voorbeeldcode kunt u gebruikers en rollen maken en beheren, maar u moet eerst een beheerdersaccount hebben om de rollen en gebruikersbeheerderspagina's uit te voeren. In dit voorbeeld wordt het beheerdersaccount gemaakt wanneer de database wordt geseed.

Wijzig het wachtwoord en wijzig de naam in een account waar u e-mailmeldingen kunt ontvangen.

Waarschuwing

Beveiliging: sla nooit gevoelige gegevens op in uw broncode.

Zoals eerder vermeld, voegt de app.CreatePerOwinContext-aanroep in de opstartklasse callbacks toe aan de Create-methode van de inhoud van de app DB, de gebruikersmanager en de rolbeheerklassen. De OWIN-pijplijn roept de Create methode aan voor deze klassen voor elke aanvraag en slaat de context voor elke klasse op. De accountcontroller maakt de gebruikersbeheerder beschikbaar vanuit de HTTP-context (die de OWIN-context bevat):

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

Wanneer een gebruiker een lokaal account registreert, wordt de methode HTTP Post Register aangeroepen:

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

In de bovenstaande code worden de modelgegevens gebruikt om een nieuw gebruikersaccount te maken met behulp van het ingevoerde e-mailadres en wachtwoord. Als de e-mailalias zich in het gegevensarchief bevindt, mislukt het maken van het account en wordt het formulier opnieuw weergegeven. Met de methode GenerateEmailConfirmationTokenAsync wordt een beveiligd bevestigingstoken gemaakt en opgeslagen in het ASP.NET Identiteitsgegevensarchief. Met de methode Url.Action maakt u een koppeling die het UserId en een bevestigingstoken bevat. Deze koppeling wordt vervolgens per e-mail naar de gebruiker verzonden. De gebruiker kan de koppeling in de e-mailapp selecteren om het account te bevestigen.

E-mailbevestiging instellen

Ga naar de registratiepagina van SendGrid en registreer u voor een gratis account. Voeg code toe die lijkt op het volgende om SendGrid te configureren:

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

Notitie

E-mailclients accepteren vaak alleen sms-berichten (geen HTML). Geef het bericht op in tekst en HTML. In het bovenstaande SendGrid-voorbeeld wordt dit gedaan met de myMessage.Text en myMessage.Html code die hierboven wordt weergegeven.

De volgende code laat zien hoe u e-mail verzendt met behulp van de MailMessage klasse, waarbij message.Body alleen de koppeling retourneert.

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

Waarschuwing

Beveiliging: sla nooit gevoelige gegevens op in uw broncode. Het account en de referenties worden opgeslagen in de appinstellingen. In Azure kunt u deze waarden veilig opslaan op het tabblad Configureren in Azure Portal. Zie Aanbevolen procedures voor het implementeren van wachtwoorden en andere gevoelige gegevens voor ASP.NET en Azure.

Voer uw SendGrid-referenties in, voer de app uit, registreer u met een e-mailalias zodat u de bevestigingslink in uw e-mail kunt selecteren. Als u wilt zien hoe u dit kunt doen met uw Outlook.com e-mailaccount, raadpleegt u de SMTP-configuratie van John Atten C# voor Outlook.Com SMTP-host en zijnASP.NET-identiteit 2.0: Accountvalidatie instellen en Two-Factor autorisatieberichten.

Zodra een gebruiker de knop Registreren selecteert, wordt er een bevestigingsmail met een validatietoken naar het e-mailadres verzonden.

afbeelding van het bevestigingsvenster voor verzonden e-mail

De gebruiker ontvangt een e-mail met een bevestigingstoken voor zijn/haar account.

afbeelding van ontvangen e-mail

De code onderzoeken

De volgende code toont de 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);
}

De methode mislukt op de achtergrond als het e-mailadres van de gebruiker niet is bevestigd. Als er een foutmelding wordt weergegeven voor een ongeldig e-mailadres, kunnen kwaadwillende gebruikers deze informatie benutten om geldige gebruikers-ID's (e-mailaliassen) te vinden en aan te vallen.

De volgende code toont de ConfirmEmail methode in de accountcontroller die wordt aangeroepen wanneer de gebruiker de bevestigingskoppeling selecteert in het e-mailbericht dat naar hen wordt verzonden:

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

Zodra een vergeten wachtwoordtoken is gebruikt, wordt het ongeldig gemaakt. De volgende codewijziging in de methode Create (in het bestand App_Start\IdentityConfig.cs) stelt in dat de tokens na 3 uur verlopen.

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

Met de bovenstaande code verlopen het vergeten wachtwoord en de e-mailbevestigingstokens over 3 uur. De standaard TokenLifespan is één dag.

De volgende code toont de bevestigingsmethode voor e-mail:

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

Om uw app veiliger te maken, ondersteunt ASP.NET Identity Two-Factor verificatie (2FA). Zie ASP.NET Identity 2.0: Accountvalidatie en Two-Factor autorisatie instellen door John Atten. Hoewel u accountvergrendeling kunt instellen bij mislukte loginpogingen, is uw login kwetsbaar voor DOS--vergrendelingen. U wordt aangeraden alleen accountvergrendeling met 2FA te gebruiken.

Aanvullende informatiebronnen