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

Před provedením tohoto kurzu byste měli nejprve dokončit vytvoření zabezpečené webové aplikace ASP.NET 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 Identity.

Místní uživatelský účet vyžaduje, aby si uživatel pro účet vytvořil heslo a toto heslo se uloží (bezpečně) ve webové aplikaci. ASP.NET Identity také podporuje účty na sociálních sítích, které nevyžadují, aby uživatel pro aplikaci vytvořil heslo. Účty na sociálních sítích používají k ověřování uživatelů 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é si zaregistrují svůj e-mailový alias, který vytvoří místní účet.

Obrázek okna registrace účtu

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

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

Uživateli se odešle e-mail s potvrzovací token pro jeho účet.

Obrázek potvrzovací token

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

Obrázek potvrzující e-mailovou adresu

Obnovení nebo resetování hesla

Místním uživatelům, kteří zapomenou heslo, může být na e-mailový účet odeslán token zabezpečení, který jim umožní resetovat heslo.

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

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

Obrázek e-mailu s resetováním hesla
Výběrem odkazu přejde na stránku Resetovat.

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

Výběrem tlačítka Resetovat potvrdíte resetování hesla.

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. Web Forms také podporují ASP.NET Identity, takže můžete v aplikaci webových formulářů postupovat podobně.

  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 jediným ověřením e-mailu atribut [EmailAddress].

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

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

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

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

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

    V tomto okamžiku nebyl e-mail potvrzen.

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

Spouštěcí třída OWIN ( Startup.cs ) se volá při spuštění aplikace a vyvolá metodu ConfigureAuth v App_Start\Startup.Auth.cs, která konfiguruje kanál OWIN a inicializuje ASP.NET Identity. Prozkoumejte metodu ConfigureAuth . Každé CreatePerOwinContext volání registruje zpětné volání (uložené v OwinContextsouboru ), které se bude volat jednou pro každý požadavek, aby se vytvořila instance zadaného typu. Můžete nastavit zarážku v konstruktoru a Create metodě každého typu (ApplicationDbContext, ApplicationUserManager) a ověřit, že jsou volána v 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řipojí k kanálu OWIN prostřednictvím middlewaru souborů cookie. Další informace najdete v tématu Správa životnosti jednotlivých požadavků pro třídu UserManager v ASP.NET Identity.

Při změně profilu zabezpečení se vygeneruje nové razítko zabezpečení a uloží se do SecurityStamp pole tabulky AspNetUsers . Všimněte si, že pole SecurityStamp se liší od souboru cookie zabezpečení. Soubor cookie zabezpečení se neukládá do AspNetUsers tabulky (ani nikde jinde v databázi identit). Token souboru cookie zabezpečení je podepsaný svým držitelem pomocí rozhraní DPAPI a vytvoří se s informacemi UserId, SecurityStamp o době vypršení platnosti a .

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

Podle komentářů v kódu UseCookieAuthentication metoda podporuje ověřování souborů cookie. Pole SecurityStamp a přidružený kód poskytují další vrstvu zabezpečení vaší aplikace. Když změníte heslo, budete odhlášeni z prohlížeče, ve který jste přihlášení. Metoda SecurityStampValidator.OnValidateIdentity umožňuje aplikaci ověřit token zabezpečení při přihlášení uživatele, který se používá 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é pomocí starého hesla byly neplatné. 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 zruší a SecurityStamp pole se aktualizuje.

Systém identit umožňuje nakonfigurovat aplikaci tak, aby se při změně profilu zabezpečení uživatelů (například při změně hesla nebo při změně přidruženého přihlášení (například z Facebooku, Google, účtu Microsoft atd.) uživatel odhlásil ze všech instancí prohlížeče. Na následujícím obrázku je například ukázková aplikace jednotného přihlašování , která uživateli umožňuje odhlásit se ze všech instancí prohlížeče (v tomto případě IE, Firefox a Chrome) výběrem 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 token zabezpečení. To je potřeba k zajištění, aby všechny tokeny (soubory cookie) vygenerované pomocí starého hesla byly neplatné. Tato funkce poskytuje další vrstvu zabezpečení vaší aplikace. při změně hesla budete odhlášeni, kde jste přihlášeni k této aplikaci.

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

Třída Startup obsahuje také kotelovou desku pro přidání sociálních přihlašovacích údajů (Facebook, Twitter atd.), další informace najdete v mém kurzu MVC 5 App with Facebook, Twitter, LinkedIn a Google OAuth2 Sign-on .

ApplicationUserManager Prozkoumejte třídu, 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).
  • Dvoufaktorové ověřování (2FA) Budu se zabývat 2FA a SMS v jiném kurzu.
  • Připojení e-mailových a SMS služeb (Budu se zabývat SMS v jiném kurzu).

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

//     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 se shodují s vlastnostmi v AspNetUsers tabulce uvedené 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 souboru 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;
    }
}

Výše zvýrazněný kód vygeneruje ClaimsIdentity. ASP.NET Identity a Ověřování souborů cookie OWIN jsou založené na deklaracích identity, proto rozhraní 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, jeho věk a role, ke kterým uživatel patří. V této fázi můžete také pro uživatele přidat další deklarace identity.

Metoda OWIN AuthenticationManager.SignIn předá ClaimsIdentity a podepíše 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 Facebookem, Twitterem, LinkedInem a přihlášením Google OAuth2 ukazuje, jak můžete do ApplicationUser třídy přidat další vlastnosti.

potvrzení Email

Je vhodné potvrdit e-mail, ke kterému se nový uživatel zaregistruje, a ověřit, že se nezadá za někoho jiného (to znamená, že se nezaregistroval v e-mailu někoho jiného). Předpokládejme, že jste měli diskuzní fórum, chcete zabránit "bob@example.com" registraci jako "joe@contoso.com". Bez potvrzení "joe@contoso.com" e-mailu můžete z vaší aplikace dostávat nežádoucí e-maily. Předpokládejme, že se Bob omylem zaregistroval jako "bib@example.com" a nevšiml si toho, že by nemohl použít obnovení hesla, protože aplikace nemá jeho správný e-mail. Email potvrzení 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 následující ukázce si uživatel nebude moct změnit heslo, dokud se jeho účet nepotvrdí (když vybere potvrzovací odkaz, který obdrží u e-mailového účtu, se kterým se zaregistroval). Tento pracovní postup můžete použít i v jiných scénářích, například odeslání odkazu pro potvrzení a resetování hesla u nových účtů vytvořených správcem, odeslání e-mailu uživateli, když si změní 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íte e-mailem, sms zprávou nebo jiným mechanismem.

Vytvoření ucelenější ukázky

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

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

  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 SendGrid k odesílání e-mailů. Balíček Identity.Samples nainstaluje kód, se kterým budeme pracovat.

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

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

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

  6. Odeberte z ukázky potvrzovací kód odkazu na ukázkový e-mail (Kód ViewBag.Link v kontroleru účtu. DisplayEmail Viz metody akcí a ForgotPasswordConfirmation a zobrazení razor ).

Upozornění

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

Prozkoumejte kód v souboru App_Start\IdentityConfig.cs.

Ukázka ukazuje, jak vytvořit účet a přidat ho do role Správa. 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 Seed metodě. Doufáme, že v budoucnu budeme mít nástroj, který vám umožní vytvářet a spravovat uživatele a role. Ukázkový kód umožňuje vytvářet a spravovat uživatele a role, ale abyste mohli spouštět role a stránky správce uživatelů, musíte mít nejprve účet správce. V této ukázce se účet správce vytvoří, když je databáze nasazená.

Změňte heslo a změňte název na účet, do kterého můžete dostávat e-mailová oznámení.

Upozornění

Zabezpečení – nikdy neukládejte citlivá data ve zdrojovém kódu.

Jak už bylo zmíněno dříve, app.CreatePerOwinContext volání ve spouštěcí třídě přidává zpětná volání do Create metody obsahu databáze aplikace, správce uživatelů a třídy správce 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 HTTP Post Register metoda:

[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 se nezdaří a formulář se znovu zobrazí. Metoda GenerateEmailConfirmationTokenAsync vytvoří token zabezpečeného potvrzení a uloží ho do úložiště dat ASP.NET Identity. Metoda Url.Action vytvoří odkaz obsahující UserId token a potvrzení. Tento odkaz se pak pošle uživateli e-mailem a uživatel může vybrat odkaz ve své e-mailové aplikaci a potvrdit svůj účet.

Nastavení potvrzení e-mailu

Přejděte na registrační stránku SendGrid a zaregistrujte si bezplatný účet. Přidejte kód podobný následujícímu, který nakonfigurujete SendGrid:

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

Email klienti často přijímají jenom 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 výše uvedeného kódu a myMessage.Html .

Následující kód ukazuje, jak odeslat e-mail 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);
}

Upozornění

Zabezpečení – nikdy neukládejte citlivá data ve zdrojovém kódu. Účet a přihlašovací údaje jsou uložené v nastavení aplikace. V Azure můžete tyto hodnoty bezpečně uložit na kartě Konfigurace v Azure Portal. Viz Osvědčené postupy pro nasazení hesel a dalších citlivých dat do ASP.NET a Azure.

Zadejte svoje přihlašovací údaje SendGrid, spusťte aplikaci, zaregistrujte se pomocí e-mailového aliasu a vyberte v e-mailu odkaz pro potvrzení. Pokud se chcete podívat, jak to udělat se svým Outlook.com e-mailovým účtem, přečtěte si článek Konfigurace SMTP v C# pro Outlook.Com SMTP Host a jehoASP.NET Identity 2.0: Nastavení ověření účtu a Two-Factor autorizačních příspěvků.

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

Obrázek okna potvrzení odeslání e-mailu

Uživateli se odešle e-mail s potvrzovací token pro jeho účet.

Obrázek přijatého e-mailu

Kontrola 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 bezobslužně, pokud nebyl potvrzen e-mail uživatele. Pokud došlo k chybě pro neplatnou e-mailovou adresu, uživatelé se zlými úmysly můžou 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, který mu byl odeslán:

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 zruší jeho platnost. Následující změna kódu v Create metodě (v souboru App_Start\IdentityConfig.cs ) nastaví tokeny tak, aby platnost tokenů vypršela za 3 hodiny.

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

S výše uvedeným kódem vyprší platnost zapomenutého hesla a tokenů potvrzení e-mailu za 3 hodiny. Výchozí hodnota 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 lépe zabezpečená, 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í pomocí hesla, díky tomuto přístupu bude vaše přihlášení náchylné k uzamčení SYSTÉMU DOS . Doporučujeme používat uzamčení účtu jenom s 2FA.

Další materiály