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:
- Vytvořte aplikaci ASP.NET MVC a prozkoumejte funkce ASP.NET Identity.
- Sestavení ukázky identity
- Nastavení potvrzení e-mailu
Noví uživatelé si zaregistrují svůj e-mailový alias, který vytvoří místní účet.
Výběrem tlačítka Registrovat se na e-mailovou adresu odešle potvrzovací e-mail obsahující ověřovací token.
Uživateli se odešle e-mail s potvrzovací token pro jeho účet.
Výběrem odkazu účet potvrdíte.
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.
Uživatel brzy dostane e-mail s odkazem, který mu umožní resetovat si heslo.
Výběrem odkazu přejde na stránku Resetovat.
Výběrem tlačítka Resetovat potvrdíte resetování hesla.
Vytvoření webové aplikace ASP.NET
Začněte instalací a spuštěním sady Visual Studio 2017.
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ě.
Změňte ověřování na Individuální uživatelské účty.
Spusťte aplikaci, vyberte odkaz Zaregistrovat a zaregistrujte uživatele. V tomto okamžiku je jediným ověřením e-mailu atribut [EmailAddress].
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:Klikněte pravým tlačítkem na tabulku AspNetUsers a vyberte Zobrazit 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 OwinContext
souboru ), 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.
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 ApplicationUserManager
třídy a EmailService
SmsService
. 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.
Vytvořte nový prázdný ASP.NET webový projekt.
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.Nastavte projekt tak, aby používal SSL.
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.
Vyberte odkaz na ukázkový e-mail, který simuluje potvrzení e-mailu.
Odeberte z ukázky potvrzovací kód odkazu na ukázkový e-mail (Kód
ViewBag.Link
v kontroleru účtu.DisplayEmail
Viz metody akcí aForgotPasswordConfirmation
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.
Uživateli se odešle e-mail s potvrzovací token pro jeho účet.
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
- Přehled poskytovatelů vlastního úložiště pro ASP.NET Identity
- Aplikace MVC 5 se službou Facebook, Twitter, LinkedIn a Google OAuth2 Sign-on také ukazuje, jak přidat informace o profilu do tabulky uživatelů.
- ASP.NET MVC a Identity 2.0: Principy základů od Johna Attena.
- Úvod do ASP.NET Identity
- Oznamujeme rtm ASP.NET Identity 2.0.0 pranav Rastogi.