Sdílet prostřednictvím


Potvrzení účtu a obnovení hesla pomocí ASP.NET Identity (C#)

Před tímto kurzem byste měli nejprve dokončit Vytvořit zabezpečenou ASP.NET webovou aplikaci MVC 5 s přihlášením, potvrzením e-mailu a resetováním hesla. Tento kurz obsahuje další podrobnosti a ukáže vám, jak nastavit e-mail pro potvrzení místního účtu a umožnit uživatelům resetovat zapomenuté heslo v ASP.NET Identita.

Místní uživatelský účet vyžaduje, aby uživatel vytvořil heslo pro tento účet a toto heslo je uložené (bezpečně) ve webové aplikaci. ASP.NET Identity také podporuje sociální účty, které nevyžadují, aby uživatel vytvořil heslo pro aplikaci. účty sociálních sítí k ověřování uživatelů používají třetí stranu (například Google, Twitter, Facebook nebo Microsoft). Toto téma se zabývá následujícími tématy:

Noví uživatelé zaregistrují svůj e-mailový alias, který vytvoří místní účet.

Obrázek okna registrace účtu

Výběrem tlačítka Zaregistrovat odešlete potvrzovací e-mail obsahující ověřovací token na e-mailovou adresu.

obrázek s potvrzením odeslání e-mailu

Uživateli se odešle e-mail s potvrzovací tokenem pro svůj účet.

Obrázek potvrzovacího tokenu

Výběrem odkazu účet potvrdíte.

Obrázek potvrzující e-mailovou adresu

Obnovení nebo resetování hesla

Místní uživatelé, kteří zapomněli heslo, můžou mít token zabezpečení odeslaný na svůj e-mailový účet a umožnit jim resetovat heslo.

Obrázek okna zapomenutého resetování hesla

Uživatel brzy dostane e-mail s odkazem, který mu umožní resetovat heslo.

obrázek znázorňující e-mail pro obnovení hesla
Výběrem odkazu přejdete na stránku Obnovit.

obrázek znázorňující okno pro resetování hesla uživatele

Výběrem tlačítka Resetovat potvrďte, že se heslo resetovalo.

obrázek s potvrzením resetování hesla

Vytvoření webové aplikace ASP.NET

Začněte instalací a spuštěním sady Visual Studio 2017.

  1. Vytvořte nový webový projekt ASP.NET a vyberte šablonu MVC. Webové formuláře také podporují ASP.NET Identity, takže můžete postupovat podobně v aplikaci webových formulářů.

  2. Změňte ověřování na Individuální Uživatelské Účty.

  3. Spusťte aplikaci, vyberte odkaz Zaregistrovat a zaregistrujte uživatele. V tomto okamžiku je e-mail ověřován pouze pomocí atributu [EmailAddress].

  4. V Průzkumníku serveru přejděte na Datová připojení\DefaultConnection\Tables\AspNetUsers, klikněte pravým tlačítkem myši a vyberte Otevřít definici tabulky.

    Následující obrázek znázorňuje schéma AspNetUsers:

    Obrázek znázorňující schéma A s p Net Users

  5. Klikněte pravým tlačítkem myši na tabulku AspNetUsers a vyberte Zobrazit data tabulky.

    Obrázek znázorňující data tabulky

    V tomto okamžiku se e-mail nepotvrdil.

Výchozí úložiště dat pro ASP.NET Identity je Entity Framework, ale můžete ho nakonfigurovat tak, aby používala jiná úložiště dat a přidala další pole. Na konci tohoto kurzu najdete části Další zdroje informací.

Spouštěcí třída OWIN (Startup.cs) se volá při spuštění aplikace a vyvolá metodu v App_Start\Startup.Auth.cs, která konfiguruje kanál OWIN a inicializuje ASP.NET Identity. Prozkoumejte metodu ConfigureAuth. Každé volání CreatePerOwinContext zaregistruje zpětné volání (uložené v OwinContext), které bude voláno jednou za každý požadavek k vytvoření instance zadaného typu. Můžete nastavit bod přerušení v konstruktoru a metodě Create každého typu (ApplicationDbContext, ApplicationUserManager) a ověřit, že jsou volány při každém požadavku. Instance ApplicationDbContext a ApplicationUserManager je uložena v kontextu OWIN, ke kterému je možné přistupovat v celé aplikaci. ASP.NET Identity se připojuje k potrubí OWIN prostřednictvím middleware pro soubory cookie. Další informace naleznete v tématu Správa životnosti požadavků pro třídu UserManager v ASP.NET Identity.

Když změníte profil zabezpečení, vygeneruje se nové razítko zabezpečení a uloží se do pole SecurityStamptabulky AspNetUsers. Všimněte si, že pole SecurityStamp se liší od souboru cookie zabezpečení. Soubor cookie zabezpečení není uložen v tabulce AspNetUsers (nebo kdekoli jinde ve službě Identity DB). Token souboru cookie zabezpečení je podepsaný svým držitelem pomocí DPAPI a vytvoří se s UserId, SecurityStamp a informacemi o době vypršení platnosti.

Middleware pro soubory cookie kontroluje soubor cookie při každém požadavku. Metoda SecurityStampValidator ve třídě Startup se pravidelně připojuje k databázi a kontroluje razítko zabezpečení, jak je uvedeno v validateInterval. K tomu dochází pouze každých 30 minut (v naší ukázce), pokud nezměníte svůj profil zabezpečení. 30minutový interval byl zvolen tak, aby se minimalizovaly cesty do databáze. Další podrobnosti najdete v návodu na dvoufaktorové ověřování.

V komentářích v kódu podporuje metoda UseCookieAuthentication ověřování souborů cookie. Pole SecurityStamp a přidružený kód poskytují vaší aplikaci další vrstvu zabezpečení, když změníte heslo, budete odhlášeni z prohlížeče, se kterým jste se přihlásili. Metoda SecurityStampValidator.OnValidateIdentity aplikaci umožňuje ověřit token zabezpečení při přihlášení uživatele, který se použije při změně hesla nebo použití externího přihlášení. To je potřeba k zajištění, aby všechny tokeny (soubory cookie) vygenerované se starým heslem byly zneplatněny. Pokud v ukázkovém projektu změníte heslo uživatele, vygeneruje se pro uživatele nový token, všechny předchozí tokeny se zneplatní a pole SecurityStamp se aktualizuje.

Systém identit umožňuje nakonfigurovat aplikaci, takže když se změní profil zabezpečení uživatelů (například když uživatel změní heslo nebo změny přidružené k přihlášení (například z Facebooku, Googlu, účtu Microsoft atd.), uživatel se odhlásí ze všech instancí prohlížeče. Například na následujícím obrázku je ukázka aplikace pro jednotné odhlášení, která uživateli umožňuje odhlásit se ze všech instancí prohlížeče (v tomto případě IE, Firefox a Chrome) pomocí jednoho tlačítka. Případně vám ukázka umožňuje odhlásit se jenom z konkrétní instance prohlížeče.

Obrázek znázorňující okno ukázkové aplikace pro jednotné odhlášení

Ukázková aplikace jednotného přihlašování ukazuje, jak ASP.NET Identity umožňuje znovu vygenerovat bezpečnostní token. To je potřeba k zajištění, aby všechny tokeny (soubory cookie) vygenerované se starým heslem byly zneplatněny. Tato funkce poskytuje vaší aplikaci další vrstvu zabezpečení; když změníte heslo, budete odhlášeni tam, kde jste se k této aplikaci přihlásili.

Soubor App_Start\IdentityConfig.cs obsahuje třídy ApplicationUserManager, EmailService a SmsService. Třídy EmailService a SmsService implementují rozhraní IIdentityMessageService, takže v každé třídě máte společné metody konfigurace e-mailu a SMS. I když tento kurz ukazuje, jak přidat e-mailové oznámení prostřednictvím SendGrid, můžete odesílat e-maily pomocí PROTOKOLU SMTP a dalších mechanismů.

Třída Startup také obsahuje šablonu kódu pro přidání přihlášení k sociálním sítím (Facebook, Twitter atd.), podívejte se na můj kurz MVC 5 aplikace s Facebook, Twitter, LinkedIn a Google OAuth2 Přihlášení pro více informací.

Prozkoumejte třídu ApplicationUserManager, která obsahuje informace o identitě uživatelů a konfiguruje následující funkce:

  • Požadavky na sílu hesla
  • Uzamčení uživatele (pokusy a čas)
  • Dvojúrovňové ověřování (2FA). Budu se zabývat 2FA a SMS v jiném kurzu.
  • Připojení e-mailu a služeb SMS (Pokryji SMS v jiném tutoriálu).

Třída ApplicationUserManager je odvozena z obecné třídy UserManager<ApplicationUser>. ApplicationUser je odvozena od IdentityUser. IdentityUser je odvozený z obecné třídy IdentityUser.

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

Výše uvedené vlastnosti odpovídají vlastnostem v tabulce AspNetUsers, jak je znázorněno výše.

Obecné argumenty pro IUser umožňují odvodit třídu pomocí různých typů pro primární klíč. Podívejte se na ukázku ChangePK, která ukazuje, jak změnit primární klíč z řetězce na int nebo GUID.

ApplicationUser

ApplicationUser (public class ApplicationUserManager : UserManager<ApplicationUser>) je definován v Models\IdentityModels.cs jako:

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

Zvýrazněný kód výše uvedený generuje ClaimsIdentity. ASP.NET Identita a ověřování souborů cookie OWIN jsou založené na deklaracích, proto architektura vyžaduje, aby aplikace vygenerovala ClaimsIdentity pro uživatele. ClaimsIdentity obsahuje informace o všech deklarací identity uživatele, jako je jméno uživatele, věk a role, ke které uživatel patří. V této fázi můžete také přidat další požadavky pro uživatele.

Metoda AuthenticationManager.SignIn OWIN předává ClaimsIdentity jako argument a přihlásí uživatele:

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

aplikace MVC 5 s přihlášením k Facebooku, Twitteru, LinkedInu a Google OAuth2 ukazuje, jak můžete do třídy ApplicationUser přidat další vlastnosti.

Potvrzení e-mailu

Je dobrý nápad potvrdit e-mail, se kterým se nový uživatel zaregistruje, aby se ověřilo, že se nevydává za někoho jiného (to znamená, že se nezaregistroval s e-mailem někoho jiného). Pokud byste měli diskuzní fórum, chtěli byste zabránit, aby se "bob@example.com" registrovalo jako "joe@contoso.com". Bez potvrzení e-mailu může "joe@contoso.com" z vaší aplikace dostat nežádoucí e-maily. Předpokládejme, že se Bob omylem zaregistroval pod číslem "bib@example.com" a nevšiml si toho; nemohl by obnovit heslo, protože aplikace nemá jeho správný e-mail. Potvrzení e-mailu poskytuje pouze omezenou ochranu před roboty a neposkytuje ochranu před určenými spammery, mají mnoho pracovních e-mailových aliasů, které můžou použít k registraci. V ukázce níže uživatel nebude moct změnit heslo, dokud se jeho účet nepotvrdí (výběrem potvrzovacího odkazu přijatého na e-mailovém účtu, se kterým je zaregistrovaný.) Tento pracovní postup můžete použít v jiných scénářích, například odeslání odkazu na potvrzení a resetování hesla u nových účtů vytvořených správcem, odeslání e-mailu uživateli, když změnil svůj profil atd. Obecně chcete zabránit novým uživatelům v publikování jakýchkoli dat na váš web předtím, než je potvrdí e-mail, SMS textová zpráva nebo jiný mechanismus.

Vytvořte ucelenější ukázku

V této části použijete NuGet ke stažení ucelenější ukázky, se kterou budeme pracovat.

  1. Vytvořte nový prázdný webový projekt ASP.NET.

  2. V konzole Správce balíčků zadejte následující příkazy:

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

    V tomto kurzu použijeme k odesílání e-mailů SendGrid. Balíček Identity.Samples nainstaluje kód, se kterým budeme pracovat.

  3. Nastavte projekt tak, aby používal protokol SSL.

  4. Otestujte vytvoření místního účtu spuštěním aplikace, výběrem odkazu Zaregistrovat a publikováním registračního formuláře.

  5. Vyberte ukázkový e-mailový odkaz, který simuluje potvrzení e-mailu.

  6. Odeberte potvrzovací kód odkazu z ukázkového e-mailu (kód ViewBag.Link v kontroleru účtu. Podívejte se na metody akcí a zobrazení razor DisplayEmail a ForgotPasswordConfirmation).

Varování

Pokud změníte některá nastavení zabezpečení v této ukázce, musí produkční aplikace projít auditem zabezpečení, který explicitně volá provedené změny.

Prozkoumání kódu v App_Start\IdentityConfig.cs

Ukázka ukazuje, jak vytvořit účet a přidat ho do role správce . E-mail v ukázce byste měli nahradit e-mailem, který budete používat pro účet správce. Nejjednodušší způsob, jak teď vytvořit účet správce, je programově v metodě Seed. Doufáme, že v budoucnu budeme mít nástroj, který vám umožní vytvářet a spravovat uživatele a role. Vzorový kód umožňuje vytvářet a spravovat uživatele a role, ale abyste mohli spouštět role a stránky pro správu uživatelů, musíte mít nejprve účet správce. V této ukázce se účet správce vytvoří při počátečním vytvoření databáze.

Změňte heslo a změňte jméno na účet, kde můžete dostávat e-mailová oznámení.

Varování

Zabezpečení – Do zdrojového kódu nikdy neukládáte citlivá data.

Jak už bylo zmíněno dříve, volání app.CreatePerOwinContext ve spouštěcí třídě přidává zpětná volání do Create metody obsahu databáze aplikací, správce uživatelů a tříd správců rolí. Kanál OWIN volá metodu Create pro tyto třídy pro každý požadavek a ukládá kontext pro každou třídu. Kontroler účtu zveřejňuje správce uživatelů z kontextu HTTP (který obsahuje kontext OWIN):

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

Když uživatel zaregistruje místní účet, volá se metoda HTTP Post Register:

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

Výše uvedený kód používá data modelu k vytvoření nového uživatelského účtu pomocí zadaného e-mailu a hesla. Pokud je e-mailový alias v úložišti dat, vytvoření účtu selže a formulář se znovu zobrazí. Metoda GenerateEmailConfirmationTokenAsync vytvoří zabezpečený potvrzovací token a uloží ho do úložiště dat ASP.NET Identity. Metoda Url.Action vytvoří odkaz obsahující UserId a potvrzovací token. Tento odkaz se pak uživateli pošle e-mailem, uživatel může vybrat odkaz v e-mailové aplikaci a potvrdit svůj účet.

Nastavení potvrzení e-mailu

Přejděte na registrační stránku SendGridu a zaregistrujte si bezplatný účet. Přidejte kód podobný následujícímu kódu pro konfiguraci SendGridu:

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

Poznámka

E-mailové klienty často přijímají pouze textové zprávy (bez HTML). Zprávu byste měli zadat v textu a HTML. V ukázce SendGrid výše se to provádí pomocí myMessage.Text a myMessage.Html kódu uvedeného výše.

Následující kód ukazuje, jak odesílat e-maily pomocí třídy MailMessage, kde message.Body vrací pouze odkaz.

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

Varování

Zabezpečení – Do zdrojového kódu nikdy neukládáte citlivá data. Účet a přihlašovací údaje jsou uložené v appSetting. V Azure můžete tyto hodnoty bezpečně uložit na kartě Konfigurace v portálu Azure. Podívejte se na osvědčené postupy pro nasazení hesel a dalších citlivých dat do ASP.NET a Azure.

Zadejte svoje přihlašovací údaje SendGridu, spusťte aplikaci, zaregistrujte se pomocí e-mailového aliasu a v e-mailu můžete vybrat odkaz pro potvrzení. Pokud chcete zjistit, jak to udělat s vaším e-mailovým účtem Outlook.com, podívejte se na John Atten's Konfigurace C# SMTP pro Outlook.Com SMTP Host a jeho příspěvkyASP.NET Identity 2.0: Nastavení ověřování účtu a Two-Factor autorizace.

Jakmile uživatel vybere tlačítko Zaregistrovat, odešle se na e-mailovou adresu potvrzovací e-mail obsahující ověřovací token.

Obrázek okna potvrzení odeslaného e-mailem

Uživateli se odešle e-mail s potvrzovací tokenem pro svůj účet.

Obrázek přijatého e-mailu

Prozkoumání kódu

Následující kód ukazuje metodu POST ForgotPassword.

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

Metoda selže bez upozornění, pokud nebyl potvrzen uživatelův e-mail. Pokud se u neplatné e-mailové adresy publikovala chyba, můžou uživatelé se zlými úmysly tyto informace použít k vyhledání platného ID uživatele (e-mailových aliasů) k útoku.

Následující kód ukazuje metodu ConfirmEmail v kontroleru účtu, který se volá, když uživatel vybere potvrzovací odkaz v e-mailu odeslaném jim:

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

Po použití zapomenutého tokenu hesla se zneplatní. Následující změna kódu v metodě Create (v souboru App_Start\IdentityConfig.cs) nastaví tokeny tak, aby platnost vypršela za 3 hodiny.

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

U výše uvedeného kódu vyprší platnost zapomenutého hesla a tokenů potvrzení e-mailu za 3 hodiny. Výchozí TokenLifespan je jeden den.

Následující kód ukazuje metodu potvrzení e-mailu:

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

Aby byla vaše aplikace bezpečnější, ASP.NET Identity podporuje ověřování Two-Factor (2FA). Viz ASP.NET Identity 2.0: Nastavení ověřování účtu a Two-Factor autorizace Johnem Attenem. I když můžete nastavit uzamčení účtu při neúspěšných pokusech o přihlášení k heslu, je tento přístup náchylný k přihlášení DOS uzamčení. Doporučujeme používat uzamčení účtu jenom s 2FA.

Další zdroje informací