Megosztás a következőn keresztül:


Fiók megerősítése és jelszó helyreállítása ASP.NET identitással (C#)

Az oktatóanyag elvégzése előtt el kell végeznie Biztonságos ASP.NET MVC 5 webalkalmazás létrehozása bejelentkezéssel, e-mail-megerősítéssel és jelszó-visszaállítással. Ez az oktatóanyag további részleteket tartalmaz, és bemutatja, hogyan állíthat be e-maileket a helyi fiók megerősítéséhez, és hogyan engedélyezheti a felhasználóknak, hogy visszaállítsák az elfelejtett jelszót ASP.NET Identitásban.

A helyi felhasználói fiókokhoz a felhasználónak létre kell hoznia egy jelszót a fiókhoz, és a jelszó tárolása (biztonságosan) a webalkalmazásban történik. ASP.NET Identitás a közösségi fiókokat is támogatja, amelyek nem igénylik a felhasználótól, hogy jelszót hozzon létre az alkalmazáshoz. közösségi fiókok harmadik fél (például Google, Twitter, Facebook vagy Microsoft) használatával hitelesítik a felhasználókat. Ez a témakör a következőket ismerteti:

Az új felhasználók regisztrálják az e-mail-aliasukat, amely létrehoz egy helyi fiókot.

A fiókregisztrálás ablakának képe

A Regisztráció gomb kiválasztása egy érvényesítési tokent tartalmazó visszaigazoló e-mailt küld az e-mail címükre.

Kép, amely emailben küldött visszaigazolást mutat

A rendszer e-mailt küld a felhasználónak a fiókjukhoz tartozó megerősítő tokennel.

megerősítő token képe

A hivatkozás kiválasztása megerősíti a fiókot.

e-mail-címet erősítő kép

Jelszó helyreállítása/alaphelyzetbe állítása

Azok a helyi felhasználók, akik elfelejtik a jelszavukat, biztonsági jogkivonatot küldhetnek az e-mail-fiókjukba, így visszaállíthatják a jelszavukat.

Elfelejtett jelszó-visszaállítás ablak képe

A felhasználó hamarosan kap egy e-mailt egy hivatkozással, amely lehetővé teszi számukra a jelszó visszaállítását.

Kép a jelszó-visszaállító emailről
A hivatkozás kiválasztásával az Alaphelyzetbe állítás lapra kerülnek.

a felhasználói jelszó alaphelyzetbe állító ablakot bemutató kép

Ha a Alaphelyzetbe állítás gombot választja, ezzel megerősíti, hogy a jelszó vissza lett állítva.

a jelszó-visszaállítás megerősítését bemutató kép

ASP.NET webalkalmazás létrehozása

Először telepítse és futtassa Visual Studio 2017.

  1. Hozzon létre egy új ASP.NET webes projektet, és válassza ki az MVC-sablont. A webűrlapok az ASP.NET Identitást is támogatják, így egy webűrlapalkalmazás hasonló lépéseit követheti.

  2. Módosítsa a hitelesítést egyéni felhasználói fiókra.

  3. Futtassa az alkalmazást, válassza a Regisztrálás hivatkozást, és regisztráljon egy felhasználót. Ezen a ponton az egyetlen ellenőrzés az e-mailen az [EmailAddress] attribútummal történik.

  4. A Kiszolgálókezelőben lépjen Data Connections\DefaultConnection\Tables\AspNetUserselemre, kattintson a jobb gombbal, és válassza a Tábladefiníció megnyitásalehetőséget.

    Az alábbi képen a AspNetUsers séma látható:

    Kép az A s p Net Users sémáról

  5. Kattintson a jobb gombbal a AspNetUsers táblára, és válassza a Táblaadatok megjelenítéselehetőséget.

    Kép a táblázatadatokkal

    Ezen a ponton az e-mail nem lett megerősítve.

Az ASP.NET Identity alapértelmezett adattára az Entity Framework, de konfigurálhatja más adattárak használatára és további mezők hozzáadására. Lásd az oktatóanyag végén található További erőforrások szakaszt.

Az OWIN indítási osztály ( Startup.cs ) meghívása az alkalmazás indításakor és a App_Start\Startup.Auth.csConfigureAuth metódusának meghívásakor történik, amely konfigurálja az OWIN-folyamatot, és inicializálja ASP.NET Identity-t. Vizsgálja meg a ConfigureAuth metódust. Minden CreatePerOwinContext hívás regisztrál egy visszahívást, amely a OwinContext-ben kerül mentésre, és amely minden kérelemhez egyszer hívódik meg, hogy létrehozza a megadott típusú példányt. Beállíthat egy töréspontot az egyes típusok konstruktorában és Create metódusában (ApplicationDbContext, ApplicationUserManager), és ellenőrizheti, hogy minden egyes kérésnél meghívják-e őket. A ApplicationDbContext és ApplicationUserManager egy példánya az OWIN-környezetben van tárolva, amely az alkalmazás teljes területén elérhető. ASP.NET Identity a cookie-köztes szoftveren keresztül csatlakozik az OWIN-folyamathoz. További információ: ASP.NET IdentityUserManager osztályának kérelemenkénti élettartam-kezelése.

A biztonsági profil módosításakor a rendszer létrehoz és tárol egy új biztonsági bélyeget az AspNetUsers tábla SecurityStamp mezőjében. Vegye figyelembe, hogy a SecurityStamp mező eltér a biztonsági cookie-tól. A biztonsági cookie-t a rendszer nem tárolja a AspNetUsers táblában (vagy bárhol máshol az Identity DB-ben). A biztonsági cookie-jogkivonat önaláírással készül, DPAPI segítségével, a UserId, SecurityStamp és a lejárati idő információival.

A cookie köztes szoftver minden kéréskor ellenőrzi a cookie-t. A Startup osztály SecurityStampValidator metódusa eléri a DB-t, és a validateIntervalszerint rendszeresen ellenőrzi a biztonsági bélyeget. Ez csak 30 percenként történik (a mintánkban), hacsak nem módosítja a biztonsági profilját. A 30 perces időközt úgy választották ki, hogy minimalizálja az adatbázisba való utazásokat. További részletekért tekintse meg a kéttényezős hitelesítési oktatóanyagot.

A kód megjegyzései szerint a UseCookieAuthentication metódus támogatja a cookie-hitelesítést. A SecurityStamp mező és a hozzá tartozó kód további biztonsági réteget biztosít az alkalmazás számára, amikor módosítja a jelszavát, a rendszer kijelentkezteti a böngészőből, amellyel bejelentkezett. A SecurityStampValidator.OnValidateIdentity metódus lehetővé teszi, hogy az alkalmazás érvényesítse a biztonsági jogkivonatot, amikor a felhasználó bejelentkezik, amelyet jelszó módosításakor vagy külső bejelentkezéskor használ. Erre azért van szükség, hogy a régi jelszóval létrehozott jogkivonatok (cookie-k) érvénytelenek legyenek. A mintaprojektben, ha módosítja a felhasználói jelszót, a rendszer létrehoz egy új jogkivonatot a felhasználó számára, érvényteleníti a korábbi jogkivonatokat, és frissíti a SecurityStamp mezőt.

Az identitásrendszer lehetővé teszi az alkalmazás konfigurálását úgy, hogy amikor a felhasználók biztonsági profilja megváltozik (például amikor a felhasználó módosítja a jelszavát, vagy módosítja a társított bejelentkezést (például a Facebookról, a Google-ból, a Microsoft-fiókból stb.), a felhasználó minden böngészőpéldányból ki lesz jelentkezve. Például az alábbi képen az Egyetlen Kijelentkezés Példája alkalmazás látható, amely lehetővé teszi a felhasználónak, hogy egyetlen gomb kiválasztásával kijelentkezzen az összes böngészőablakból (ebben az esetben az IE, a Firefox és a Chrome böngészőkből). Másik lehetőségként a minta lehetővé teszi, hogy csak egy adott böngészőpéldányból jelentkezzen ki.

Kép, amely az egyszeri kijelentkezés mintaalkalmazásának ablakát mutatja

Az egyszeri kijelentkezés mintaalkalmazása bemutatja, hogyan teszi lehetővé az ASP.NET Identity a biztonsági jogkivonat újragenerálását. Erre azért van szükség, hogy a régi jelszóval létrehozott jogkivonatok (cookie-k) érvénytelenek legyenek. Ez a funkció további biztonsági réteget biztosít az alkalmazás számára; a jelszó módosításakor a rendszer kijelentkezteti, ahol bejelentkezett ebbe az alkalmazásba.

A App_Start\IdentityConfig.cs fájl tartalmazza a ApplicationUserManager, EmailService és SmsService osztályokat. A EmailService és SmsService osztályok mindegyike implementálja a IIdentityMessageService felületet, így az egyes osztályokban gyakran használt módszerekkel konfigurálhatja az e-maileket és az SMS-eket. Bár ez az oktatóanyag csak azt mutatja be, hogyan adhat hozzá e-mail-értesítéseket SendGridkeresztül, az e-maileket SMTP és más mechanizmusok használatával is elküldheti.

A Startup osztály sablonkódot is tartalmaz szociális bejelentkezések hozzáadásához (Facebook, Twitter stb.). Lásd az én oktatóanyagomat, MVC 5 alkalmazás Facebook, Twitter, LinkedIn és Google OAuth2 bejelentkezéssel, további információkért.

Vizsgálja meg a felhasználók identitásadatait tartalmazó ApplicationUserManager osztályt, és konfigurálja a következő funkciókat:

  • Jelszóerősségre vonatkozó követelmények.
  • Felhasználó kizárása (kísérletek és idő).
  • Kéttényezős hitelesítés (2FA). Egy másik oktatóanyagban a 2FA-t és az SMS-t fogom lefedni.
  • Az e-mail- és SMS-szolgáltatások csatlakoztatása. (Az SMS-t egy másik oktatóanyagban fogom tárgyalni).

A ApplicationUserManager osztály az általános UserManager<ApplicationUser> osztályból származik. ApplicationUser az IdentityUser-ból származik. IdentityUser az általános IdentityUser osztályból származik:

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

A fenti tulajdonságok egybeesnek a fenti AspNetUsers táblázat tulajdonságaival.

A IUser általános argumentumai lehetővé teszik, hogy az elsődleges kulcs különböző típusait használó osztályt származtatassunk. Tekintse meg a ChangePK mintát, amely bemutatja, hogyan módosíthatja az elsődleges kulcsot sztringről int vagy GUID-ra.

ApplicationUser

A ApplicationUser (public class ApplicationUserManager : UserManager<ApplicationUser>) Models\IdentityModels.cs a következő módon van definiálva:

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

A fent kiemelt kód létrehoz egy ClaimsIdentity. ASP.NET identitás- és OWIN cookie-hitelesítés jogcímalapú, ezért a keretrendszer megköveteli, hogy az alkalmazás létrehozzon egy ClaimsIdentity a felhasználó számára. ClaimsIdentity rendelkezik a felhasználó összes jogcímével, például a felhasználó nevével, életkorával és a felhasználó szerepköreivel kapcsolatban. Ebben a szakaszban további követeléseket is hozzáadhat a felhasználóhoz.

Az OWIN AuthenticationManager.SignIn metódus megkapja a ClaimsIdentity paramétert, és bejelentkezteti a felhasználót.

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

MVC 5 alkalmazás Facebook, Twitter, LinkedIn és Google OAuth2 bejelentkezési bemutatja, hogyan adhat hozzá további tulajdonságokat a ApplicationUser osztályhoz.

E-mail visszaigazolása

Érdemes ellenőrizni az új felhasználó által regisztrált e-mailt, hogy ellenőrizze, hogy nem másnak adja-e meg magát (vagyis nem regisztrált valaki más e-mailjéhez). Tegyük fel, hogy lenne egy vitafóruma, és le szeretné tiltani, hogy "bob@example.com" regisztráljon "joe@contoso.com". E-mail megerősítése nélkül "joe@contoso.com" kéretlen e-maileket kaphat az alkalmazástól. Tegyük fel, hogy Bob véletlenül regisztrált "bib@example.com" ként, és nem vette észre, nem használhatja a jelszó-helyreállítást, mert az alkalmazás nem rendelkezik a megfelelő e-mail-címével. Az e-mail-megerősítés csak korlátozott védelmet biztosít a robotok ellen, és nem nyújt védelmet a meghatározott levélszemétküldők ellen, sok működő e-mail-aliassal rendelkeznek, amelyeket regisztrálhatnak. Az alábbi példában a felhasználó nem tudja módosítani a jelszavát, amíg meg nem erősíti a fiókját (a regisztrált e-mail-fiókhoz kapott megerősítő hivatkozást választva).) Ezt a munkafolyamatot más forgatókönyvekre is alkalmazhatja, például egy hivatkozás elküldésével megerősítheti és alaphelyzetbe állíthatja a rendszergazda által létrehozott új fiókok jelszavát, és e-mailt küldhet a felhasználónak, amikor módosította a profilját, és így tovább. Általában meg szeretné akadályozni, hogy az új felhasználók bármilyen adatot közzétehessenek a webhelyére, mielőtt e-mailben, SMS-üzenetben vagy más mechanizmussal megerősítést nyertek volna.

Teljesebb minta létrehozása

Ebben a szakaszban a NuGet használatával fog letölteni egy teljesebb mintát, amellyel dolgozni fogunk.

  1. Hozzon létre egy új üres ASP.NET webes projektet.

  2. A Package Manager konzolon adja meg a következő parancsokat:

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

    Ebben az oktatóanyagban SendGrid használatával küldünk e-maileket. A Identity.Samples csomag telepíti azt a kódot, amellyel dolgozni fogunk.

  3. Állítsa be a projektet SSL-használatára.

  4. Tesztelje a helyi fiókok létrehozását az alkalmazás futtatásával, a Regisztráció hivatkozás kiválasztásával és a regisztrációs űrlap közzétételével.

  5. Válassza ki az e-mail-megerősítést szimuláló bemutató e-mail-hivatkozást.

  6. Távolítsa el a bemutató e-mail hivatkozás megerősítő kódját a mintából (a ViewBag.Link kód a fiókvezérlőben. Tekintse meg a DisplayEmail és ForgotPasswordConfirmation műveleti metódusokat és a Razor nézeteket).

Figyelmeztetés

Ha a mintában szereplő biztonsági beállítások bármelyikét módosítja, a termelési alkalmazásoknak egy olyan biztonsági auditon kell átesniük, amely kifejezetten megemlíti a végrehajtott módosításokat.

Vizsgáld meg az App_Start\IdentityConfig.cs fájlt

A minta bemutatja, hogyan lehet egy fiókot létrehozni és hozzáadni a rendszergazdai szerepkörhöz. A mintában szereplő e-mailt cserélje le a rendszergazdai fiókhoz használni kívánt e-mailre. A rendszergazdai fiók létrehozásának legegyszerűbb módja jelenleg a Seed metódus programozott módon történő létrehozása. Reméljük, hogy a jövőben lesz egy eszköz, amely lehetővé teszi a felhasználók és szerepkörök létrehozását és felügyeletét. A mintakód lehetővé teszi a felhasználók és szerepkörök létrehozását és kezelését, de először rendszergazdai fiókkal kell rendelkeznie a szerepkörök és a felhasználói rendszergazdai lapok futtatásához. Ebben a mintában a rendszergazdai fiók a adatbázis telepítésekor jön létre.

Módosítsa a jelszót, és módosítsa a nevet egy fiókra, ahol e-mail-értesítéseket kaphat.

Figyelmeztetés

Biztonság – Soha ne tároljon bizalmas adatokat a forráskódban.

Ahogy korábban említettük, az indítási osztály app.CreatePerOwinContext hívása visszahívásokat ad hozzá az alkalmazás DB-tartalom, a felhasználókezelő és a szerepkör-gazdaosztályok Create metódusához. Az OWIN-folyamat meghívja a Create metódust ezeken az osztályokon minden egyes kéréshez, és tárolja az egyes osztályok környezetét. A fiókvezérlő a http-környezetből teszi elérhetővé a felhasználókezelőt (amely tartalmazza az OWIN-környezetet):

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

Amikor egy felhasználó regisztrál egy helyi fiókot, a rendszer meghívja a HTTP Post Register metódust:

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

A fenti kód a modell adataival hoz létre egy új felhasználói fiókot a megadott e-mail és jelszó használatával. Ha az e-mail alias az adattárban található, a fiók létrehozása meghiúsul, és az űrlap ismét megjelenik. A GenerateEmailConfirmationTokenAsync metódus létrehoz egy biztonságos megerősítési jogkivonatot, és az ASP.NET Identitásadattárban tárolja. Az Url.Action metódus létrehoz egy hivatkozást, amely tartalmazza a UserId és a megerősítési jogkivonatot. Ezt a hivatkozást ezután e-mailben küldi el a felhasználónak, a felhasználó a levelezési alkalmazásban a hivatkozásra kattintva megerősítheti a fiókját.

E-mail-megerősítés beállítása

Lépjen a SendGrid regisztrációs oldalára, és regisztráljon ingyenes fiókra. A SendGrid konfigurálásához az alábbihoz hasonló kódot adhat hozzá:

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

Jegyzet

Az e-mail-ügyfelek gyakran csak szöveges üzeneteket fogadnak el (HTML nélkül). Az üzenetet szövegben és HTML-ben kell megadnia. A fenti SendGrid-mintában ez a fent látható myMessage.Text és myMessage.Html kóddal történik.

Az alábbi kód bemutatja, hogyan küldhet e-mailt a MailMessage osztály használatával, ahol message.Body csak a hivatkozást adja vissza.

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

Figyelmeztetés

Biztonság – Soha ne tároljon bizalmas adatokat a forráskódban. A fiók és a hitelesítő adatok az appSettingban vannak tárolva. Az Azure-ban ezeket az értékeket biztonságosan tárolhatja az Azure Portal Konfigurálás lapján. Tekintse meg jelszavak és más bizalmas adatok ASP.NET és Azurevaló üzembe helyezésének ajánlott eljárásait.

Adja meg SendGrid-hitelesítő adatait, futtassa az alkalmazást, regisztráljon egy e-mail-aliassal, és válassza a megerősítési hivatkozást az e-mailben. A Outlook.com e-mail-fiókjával kapcsolatos teendőkről John Atten C# SMTP-konfigurációja Outlook.Com SMTP-gazdagép ésASP.NET Identity 2.0: Fiókérvényesítés beállítása és Two-Factor engedélyezési bejegyzései című témakörben olvashat.

Miután a felhasználó kiválasztotta a Regisztrálás gombot, a rendszer egy érvényesítési jogkivonatot tartalmazó visszaigazoló e-mailt küld az e-mail-címére.

Az e-mailben küldött visszaigazoló ablak képe

A felhasználó e-mailt kap a fiókjához tartozó megerősítő tokennel.

fogadott e-mail képe

A kód vizsgálata

Az alábbi kód a POST ForgotPassword metódust mutatja be.

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

A metódus csendesen meghiúsul, ha a felhasználói e-mail nem lett megerősítve. Ha érvénytelen e-mail-címmel kapcsolatos hibaüzenetet tett közzé, a rosszindulatú felhasználók ezen információk alapján megkereshetik az érvényes userId azonosítókat (e-mail aliasokat) a támadáshoz.

Az alábbi kód a ConfirmEmail metódust jeleníti meg a fiókvezérlőben, amelyet akkor hívunk meg, amikor a felhasználó kiválasztja a megerősítő hivatkozást a nekik küldött e-mailben:

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

Miután egy elfelejtett jelszó token felhasználásra került, érvénytelenné válik. A következő kódmódosítás a Create metódusban (a App_Start\IdentityConfig.cs fájlban) 3 órán belül lejáró jogkivonatokat állít be.

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

A fenti kóddal az elfelejtett jelszó és az e-mail-megerősítési jogkivonatok 3 órán belül lejárnak. Az alapértelmezett TokenLifespan egy nap.

Az alábbi kód az e-mail-megerősítési módszert mutatja:

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

Az alkalmazás biztonságosabbá tétele érdekében az ASP.NET Identity támogatja Two-Factor hitelesítést (2FA). Lásd: ASP.NET Identity 2.0: Fiókérvényesítés beállítása és Two-Factor engedélyezés John Atten által. Bár beállíthatja a fiókzárolást a bejelentkezési jelszóval kapcsolatos hibák esetén, ez a módszer érzékenysé teszi a bejelentkezést DOS- zárolásokra. Javasoljuk, hogy csak 2FA-val használja a fiókzárolást.

További erőforrások