Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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:
- ASP.NET MVC-alkalmazás létrehozása és ASP.NET identitásfunkciók megismerése.
- Identitásminta létrehozása
- E-mail megerősítésének beállítása
Az új felhasználók regisztrálják az e-mail-aliasukat, amely létrehoz egy helyi fiókot.
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.
A rendszer e-mailt küld a felhasználónak a fiókjukhoz tartozó megerősítő tokennel.
A hivatkozás kiválasztása megerősíti a fiókot.
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.
A felhasználó hamarosan kap egy e-mailt egy hivatkozással, amely lehetővé teszi számukra a jelszó visszaállítását.
A hivatkozás kiválasztásával az Alaphelyzetbe állítás lapra kerülnek.
Ha a Alaphelyzetbe állítás gombot választja, ezzel megerősíti, hogy a jelszó vissza lett állítva.
ASP.NET webalkalmazás létrehozása
Először telepítse és futtassa Visual Studio 2017.
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.
Módosítsa a hitelesítést egyéni felhasználói fiókra.
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.
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
AspNetUsersséma látható:
Kattintson a jobb gombbal a AspNetUsers táblára, és válassza a Táblaadatok megjelenítéselehetőséget.
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.
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.
Hozzon létre egy új üres ASP.NET webes projektet.
A Package Manager konzolon adja meg a következő parancsokat:
Install-Package SendGrid Install-Package -Prerelease Microsoft.AspNet.Identity.SamplesEbben az oktatóanyagban SendGrid használatával küldünk e-maileket. A
Identity.Samplescsomag telepíti azt a kódot, amellyel dolgozni fogunk.Állítsa be a projektet SSL-használatára.
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.
Válassza ki az e-mail-megerősítést szimuláló bemutató e-mail-hivatkozást.
Távolítsa el a bemutató e-mail hivatkozás megerősítő kódját a mintából (a
ViewBag.Linkkód a fiókvezérlőben. Tekintse meg aDisplayEmailésForgotPasswordConfirmationmű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.
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
- ASP.NET Identity egyéni tárolószolgáltatóinak áttekintése
- Az MVC 5 alkalmazás a Facebook, a Twitter, a LinkedIn és a Google OAuth2 bejelentkezési lehetőségeit kínálja, emellett azt is bemutatja, hogyan adhat hozzá profiladatokat a felhasználók táblájához.
- ASP.NET MVC és Identity 2.0: Az alapok megértése John Attentől.
- ASP.NET Identity bemutatása
- ASP.NET Identity 2.0.0 rtm-jének bejelentése Pranav Rastogitól.