Úvod do ASP.NET Identity

Systém členství ASP.NET byl zaveden v ASP.NET 2.0 v roce 2005 a od té doby došlo k mnoha změnám ve způsobech, jakými webové aplikace obvykle zpracovávají ověřování a autorizaci. ASP.NET Identity představuje nový pohled na to, jaký by měl být systém členství při vytváření moderních aplikací pro web, telefon nebo tablet.

Pozadí: Členství v ASP.NET

Členství v ASP.NET

ASP.NET Členství bylo navržené tak, aby vyřešilo požadavky na členství na webu, které byly běžné v roce 2005 a zahrnovaly ověřování pomocí formulářů a databázi SQL Server pro uživatelská jména, hesla a profilová data. Dnes existuje mnohem širší škála možností úložiště dat pro webové aplikace a většina vývojářů chce svým webům umožnit používání zprostředkovatelů sociálních identit pro ověřování a autorizaci. Tento přechod komplikuje omezení návrhu ASP.NET členství:

  • Schéma databáze bylo navržené pro SQL Server a nemůžete ho změnit. Můžete přidat informace o profilu, ale další data se zabalí do jiné tabulky, což ztěžuje přístup jakýmkoli způsobem kromě rozhraní API poskytovatele profilu.
  • Systém zprostředkovatele umožňuje změnit záložní úložiště dat, ale systém je navržený s ohledem na předpoklady vhodné pro relační databázi. Poskytovatele můžete napsat tak, aby ukládal informace o členství v nerelačním mechanismu úložiště, jako jsou tabulky Azure Storage, ale pak musíte obejít relační návrh napsáním velkého množství kódu a spousty System.NotImplementedException výjimek pro metody, které se nevztahují na databáze NoSQL.
  • Vzhledem k tomu, že funkce přihlašování a odhlašování je založená na ověřování pomocí formulářů, nemůže systém členství používat OWIN. OWIN zahrnuje komponenty middlewaru pro ověřování, včetně podpory přihlašování pomocí externích zprostředkovatelů identity (jako jsou účty Microsoft, Facebook, Google, Twitter) a přihlašování pomocí účtů organizace z místní Active Directory nebo Azure Active Directory. OWIN také zahrnuje podporu pro OAuth 2.0, JWT a CORS.

ASP.NET jednoduché členství

ASP.NET jednoduché členství bylo vyvinuto jako systém členství pro ASP.NET webové stránky. Byl vydán s webMatrixem a sadou Visual Studio 2010 SP1. Cílem jednoduchého členství bylo usnadnit přidávání funkcí členství do aplikace Webové stránky.

Jednoduché členství sice usnadnilo přizpůsobení informací v profilu uživatele, ale přesto sdílí ostatní problémy s ASP.NET členstvím a má určitá omezení:

  • Bylo obtížné zachovat systémová data členství v nerelačním úložišti.
  • Nemůžete ho použít s OWIN.
  • Nefunguje dobře s existujícími poskytovateli členství ASP.NET a není rozšiřitelný.

ASP.NET Universal Providers

ASP.NET Univerzální poskytovatelé jsou vyvinuti, aby bylo možné uchovávat informace o členství v Microsoft Azure SQL Database, a pracují také s SQL Server Compact. Univerzální zprostředkovatelé byli postaveni na Entity Framework Code First, což znamená, že univerzální zprostředkovatele je možné použít k uchování dat v libovolném úložišti podporovaném EF. S univerzálními poskytovateli se schéma databáze také poměrně hodně vyčistilo.

Univerzální poskytovatelé jsou postaveni na infrastruktuře ASP.NET Membership, takže mají stále stejná omezení jako zprostředkovatel SqlMembership. To znamená, že byly navrženy pro relační databáze a je obtížné přizpůsobit profilové a uživatelské informace. Tito zprostředkovatelé také stále používají ověřování pomocí formulářů pro funkce přihlašování a odhlašování.

ASP.NET Identity

Vzhledem k tomu, že se příběh členství v ASP.NET v průběhu let vyvíjí, tým ASP.NET se na základě zpětné vazby od zákazníků hodně naučil.

Už neplatí předpoklad, že se uživatelé budou přihlašovat zadáním uživatelského jména a hesla, které si zaregistrovali ve vaší vlastní aplikaci. Web se stal sociálními. Uživatelé vzájemně komunikují v reálném čase prostřednictvím sociálních kanálů, jako je Facebook, Twitter a další sociální weby. Vývojáři chtějí, aby se uživatelé mohli přihlašovat pomocí svých sociálních identit, aby měli na svých webech bohaté možnosti. Moderní systém členství musí umožňovat přihlášení založená na přesměrování na zprostředkovatele ověřování, jako je Facebook, Twitter a další.

S vývojem webu se vyvíjely i vzory vývoje webu. Testování jednotek kódu aplikace se stalo základním problémem vývojářů aplikací. V roce 2008 ASP.NET přidali novou architekturu založenou na vzoru Model-View-Controller (MVC), která vývojářům pomáhá vytvářet aplikace testovatelné jednotky ASP.NET. Vývojáři, kteří chtěli testovat logiku své aplikace jednotek, chtěli, aby to bylo možné provést také se systémem členství.

Vzhledem k těmto změnám ve vývoji webových aplikací byla služba ASP.NET Identity vyvinuta s následujícími cíli:

  • One ASP.NET Identity System

    • ASP.NET Identity je možné používat se všemi ASP.NET architekturami, jako jsou ASP.NET MVC, Web Forms, webové stránky, webové rozhraní API a SignalR.
    • ASP.NET Identity můžete použít při vytváření webových, telefonních, storech nebo hybridních aplikací.
  • Snadné připojení profilových dat o uživateli

    • Máte kontrolu nad schématem informací o uživateli a profilu. Můžete například snadno povolit, aby systém ukládl data narození, která uživatelé zadali při registraci účtu ve vaší aplikaci.
  • Řízení trvalosti

    • Ve výchozím nastavení systém ASP.NET Identity ukládá všechny informace o uživatelích do databáze. ASP.NET Identity používá Entity Framework Code First k implementaci veškerého mechanismu trvalosti.
    • Vzhledem k tomu, že schéma databáze řídíte, je běžné úlohy, jako je změna názvů tabulek nebo změna datového typu primárních klíčů, jednoduché.
    • Různé mechanismy úložiště, jako jsou SharePoint, Azure Storage Table Service, databáze NoSQL atd., je snadné připojit, aniž byste museli vyvolat System.NotImplementedExceptions výjimky.
  • Testovatelnost jednotek

    • ASP.NET Identity umožňuje větší testování jednotek webové aplikace. Můžete psát testy jednotek pro části aplikace, které používají ASP.NET Identity.
  • Poskytovatel role

    • Existuje poskytovatel role, který umožňuje omezit přístup k částem vaší aplikace podle rolí. Můžete snadno vytvářet role, například "Správa", a přidávat do rolí uživatele.
  • Na základě deklarací identity

    • ASP.NET Identity podporuje ověřování na základě deklarací identity, kde je identita uživatele reprezentovaná jako sada deklarací identity. Deklarace identity umožňují vývojářům vyjádřit identitu uživatele mnohem víc, než umožňují role. Zatímco členství v rolích je jenom logická hodnota (člen nebo nečlen), deklarace identity může obsahovat bohaté informace o identitě a členství uživatele.
  • Zprostředkovatelé přihlášení k sociálních sítích

    • Do své aplikace můžete snadno přidat přihlášení sociálních sítí, jako je účet Microsoft, Facebook, Twitter, Google a další, a ukládat do aplikace data specifická pro uživatele.
  • Integrace OWIN

    • ASP.NET ověřování je teď založené na middlewaru OWIN, který je možné použít na jakémkoli hostiteli založeném na technologii OWIN. ASP.NET Identity nemá žádnou závislost na webu System.Web. Jedná se o plně kompatibilní architekturu OWIN, která se dá použít v libovolné aplikaci hostované pomocí OWIN.
    • ASP.NET Identity používá ověřování OWIN pro přihlášení nebo odhlášení uživatelů na webu. To znamená, že místo použití FormsAuthentication k vygenerování souboru cookie aplikace používá OWIN CookieAuthentication k tomu.
  • Balíček NuGet

    • ASP.NET Identity se redistribuuje jako balíček NuGet, který je nainstalovaný v šablonách ASP.NET MVC, Web Forms a webového rozhraní API, které se dodávají se sadou Visual Studio 2017. Tento balíček NuGet si můžete stáhnout z galerie NuGet.
    • Vydání ASP.NET Identity jako balíčku NuGet usnadňuje ASP.NET týmu iteraci nových funkcí a oprav chyb a jejich agilním způsobem vývojářům.

Začínáme se službou ASP.NET Identity

ASP.NET Identity se používá v šablonách projektů sady Visual Studio 2017 pro ASP.NET MVC, Web Forms, webové rozhraní API a SPA. V tomto názorném postupu si ukážeme, jak šablony projektů používají ASP.NET Identity k přidání funkce pro registraci, přihlášení a odhlášení uživatele.

ASP.NET Identity se implementuje pomocí následujícího postupu. Účelem tohoto článku je poskytnout vám základní přehled ASP.NET Identity. můžete ho sledovat krok za krokem nebo si jen přečíst podrobnosti. Podrobnější pokyny k vytváření aplikací pomocí ASP.NET Identity, včetně použití nového rozhraní API k přidání uživatelů, rolí a informací o profilu, najdete v části Další kroky na konci tohoto článku.

  1. Vytvořte aplikaci ASP.NET MVC s individuálními účty. ASP.NET Identity můžete použít v ASP.NET MVC, Web Forms, webovém rozhraní API, SignalR atd. V tomto článku začneme s aplikací ASP.NET MVC.

    Obrázek nového okna projektu ASP Dot Net

  2. Vytvořený projekt obsahuje následující tři balíčky pro ASP.NET Identity.

    • Microsoft.AspNet.Identity.EntityFramework
      Tento balíček obsahuje implementaci Entity Framework ASP.NET Identity, která zachovají data a schéma identity ASP.NET pro SQL Server.
    • Microsoft.AspNet.Identity.Core
      Tento balíček má základní rozhraní pro ASP.NET Identity. Tento balíček se dá použít k zápisu implementace pro ASP.NET Identity, která cílí na různá úložiště trvalosti, jako jsou Azure Table Storage, databáze NoSQL atd.
    • Microsoft.AspNet.Identity.OWIN
      Tento balíček obsahuje funkce, které slouží k připojení ověřování OWIN s identitou ASP.NET v aplikacích ASP.NET. Používá se, když do aplikace přidáte funkci přihlašování a zavoláte middleware OWIN Cookie Authentication, který vygeneruje soubor cookie.
  3. Vytvoření uživatele
    Spusťte aplikaci a kliknutím na odkaz Zaregistrovat vytvořte uživatele. Následující obrázek ukazuje stránku Zaregistrovat, která shromažďuje uživatelské jméno a heslo.

    Obrázek vytvoření nového účtu

    Když uživatel vybere tlačítko Zaregistrovat , Register akce kontroleru účtů ho vytvoří voláním rozhraní API ASP.NET Identity, jak je zvýrazněno níže:

    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> Register(RegisterViewModel model)
    {
        if (ModelState.IsValid)
        {
            var user = new ApplicationUser() { UserName = model.UserName };
            var result = await UserManager.CreateAsync(user, model.Password);
            if (result.Succeeded)
            {
                await SignInAsync(user, isPersistent: false);
                return RedirectToAction("Index", "Home");
            }
            else
            {
                AddErrors(result);
            }
        }
    
        // If we got this far, something failed, redisplay form
        return View(model);
    }
    
  4. Přihlaste se.
    Pokud byl uživatel úspěšně vytvořen, je přihlášen pomocí metody .SignInAsync

     [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)
            {
                 await SignInManager.SignInAsync(user, isPersistent:false, rememberBrowser:false);
                        
                 // For more information on how to enable account confirmation and password reset please visit https://go.microsoft.com/fwlink/?LinkID=320771
                 // Send an email with this link
                 // string 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 <a href=\"" + callbackUrl + "\">here</a>");
    
                 return RedirectToAction("Index", "Home");
             }
             AddErrors(result);
         }
    
        // If we got this far, something failed, redisplay form
         return View(model);
     }
    

    Metoda SignInManager.SignInAsync vygeneruje ClaimsIdentity. Vzhledem k tomu, že ASP.NET Identity a Ověřování souborů cookie OWIN jsou systémem založeným na deklaracích, rozhraní vyžaduje, aby aplikace vygenerovala identitu ClaimsIdentity pro uživatele. ClaimsIdentity obsahuje informace o všech deklaracích identity uživatele, například o rolích, do nichž uživatel patří.

  5. Odhlaste se.
    Výběrem odkazu Odhlásit se zavolejte akci LogOff v kontroleru účtu.

    // POST: /Account/LogOff
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult LogOff()
    {
        AuthenticationManager.SignOut();
        return RedirectToAction("Index", "Home");
    }
    

    Výše zvýrazněný kód zobrazuje metodu OWIN AuthenticationManager.SignOut . To je obdobou metody FormsAuthentication.SignOut používané modulem FormsAuthentication v Web Forms.

Komponenty ASP.NET Identity

Následující diagram znázorňuje komponenty systému identit ASP.NET (vyberte ho nebo v diagramu ho zvětšete). Balíčky v zelené barvě tvoří systém ASP.NET Identity. Všechny ostatní balíčky jsou závislosti, které jsou potřeba k použití systému identit ASP.NET v aplikacích ASP.NET.

Diagram znázorňující komponenty systému identit A S P dot Net

Následuje stručný popis balíčků NuGet, které nebyly zmíněny dříve:

  • Microsoft.Owin.Security.Cookies
    Middleware, který umožňuje aplikaci používat ověřování na základě souborů cookie, podobně jako asp. Ověřování pomocí formulářů na platformě NET.
  • EntityFramework
    Entity Framework je technologie pro přístup k datům doporučená microsoftem pro relační databáze.

Migrace z členství na ASP.NET Identity

Doufáme, že brzy poskytneme pokyny k migraci stávajících aplikací, které používají členství ASP.NET nebo jednoduché členství, do nového systému ASP.NET Identity.

Další kroky