Wprowadzenie do systemu ASP.NET Identity

System członkostwa ASP.NET został wprowadzony wraz z ASP.NET 2.0 w 2005 r., a od tego czasu wprowadzono wiele zmian w sposobach, w jaki aplikacje internetowe zwykle obsługują uwierzytelnianie i autoryzację. ASP.NET Identity to świeży wygląd systemu członkostwa podczas tworzenia nowoczesnych aplikacji dla internetu, telefonu lub tabletu.

Tło: członkostwo w ASP.NET

Członkostwo platformy ASP.NET

ASP.NET Członkostwo zostało zaprojektowane w celu rozwiązania wymagań dotyczących członkostwa w witrynie, które były powszechne w 2005 r., które obejmowały uwierzytelnianie formularzy, oraz bazę danych SQL Server dla nazw użytkowników, haseł i danych profilu. Obecnie istnieje znacznie szersza gama opcji przechowywania danych dla aplikacji internetowych, a większość deweloperów chce umożliwić swoim witrynom korzystanie z dostawców tożsamości społecznościowych na potrzeby funkcji uwierzytelniania i autoryzacji. Ograniczenia projektu członkostwa ASP.NET sprawiają, że przejście jest trudne:

  • Schemat bazy danych został zaprojektowany pod kątem SQL Server i nie można go zmienić. Możesz dodać informacje o profilu, ale dodatkowe dane są pakowane do innej tabeli, co utrudnia dostęp za pomocą dowolnego sposobu, z wyjątkiem interfejsu API dostawcy profilów.
  • System dostawcy umożliwia zmianę magazynu danych zapasowych, ale system jest zaprojektowany zgodnie z założeniami odpowiednimi dla relacyjnej bazy danych. Możesz napisać dostawcę do przechowywania informacji o członkostwie w mechanizmie magazynu nierelacyjnego, takiego jak tabele usługi Azure Storage, ale następnie musisz obejść projekt relacyjny, pisząc dużo kodu i wiele wyjątków System.NotImplementedException dla metod, które nie mają zastosowania do baz danych NoSQL.
  • Ponieważ funkcja logowania/wyloguj jest oparta na uwierzytelnianiu formularzy, system członkostwa nie może używać protokołu OWIN. OWIN obejmuje składniki oprogramowania pośredniczącego do uwierzytelniania, w tym obsługę logów przy użyciu zewnętrznych dostawców tożsamości (takich jak konta Microsoft, Facebook, Google, Twitter) i logowania przy użyciu kont organizacyjnych z lokalna usługa Active Directory lub usługi Azure Active Directory. OWIN obejmuje również obsługę protokołu OAuth 2.0, JWT i MECHANIZMU CORS.

ASP.NET proste członkostwo

ASP.NET proste członkostwo zostało opracowane jako system członkostwa dla ASP.NET Web Pages. Została wydana z programem WebMatrix i programem Visual Studio 2010 SP1. Celem prostego członkostwa było ułatwienie dodawania funkcji członkostwa do aplikacji web Pages.

Proste członkostwo ułatwiło dostosowanie informacji o profilu użytkownika, ale nadal udostępnia inne problemy z ASP.NET członkostwo i ma pewne ograniczenia:

  • Trudno było utrwałyć dane systemu członkostwa w magazynie nierelacyjnym.
  • Nie można jej używać z OWIN.
  • Nie działa dobrze z istniejącymi dostawcami członkostwa ASP.NET i nie jest rozszerzalny.

Standardowi dostawcy ASP.NET

ASP.NET dostawcy uniwersalni opracowali, aby umożliwić utrwalanie informacji o członkostwie w Microsoft Azure SQL Database, a także współpracowali z SQL Server Compact. Dostawcy uniwersalni zostali zbudowani na platformie Entity Framework Code First, co oznacza, że dostawcy uniwersalni mogą służyć do utrwalania danych w dowolnym magazynie obsługiwanym przez platformę EF. Wraz z dostawcami uniwersalnymi schemat bazy danych został wyczyszczony bardzo dużo.

Dostawcy uniwersalni bazują na infrastrukturze członkostwa ASP.NET, dlatego nadal mają te same ograniczenia co dostawca sqlMembership. Oznacza to, że zostały one zaprojektowane dla relacyjnych baz danych i trudno jest dostosować informacje o profilu i użytkowniku. Ci dostawcy nadal używają uwierzytelniania formularzy na potrzeby funkcji logowania i wylogowywanie.

ASP.NET Identity

Ponieważ historia członkostwa w ASP.NET ewoluowała przez lata, zespół ASP.NET nauczył się wiele od opinii klientów.

Założenie, że użytkownicy będą logowali się, wprowadzając nazwę użytkownika i hasło, które zarejestrowali we własnej aplikacji, nie jest już prawidłowe. Sieć stała się bardziej społeczna. Użytkownicy wchodzą ze sobą w interakcje w czasie rzeczywistym za pośrednictwem kanałów społecznościowych, takich jak Facebook, Twitter i inne witryny społecznościowe. Deweloperzy chcą, aby użytkownicy mogli logować się przy użyciu swoich tożsamości społecznościowych, aby mogli korzystać z bogatego środowiska w swoich witrynach internetowych. Nowoczesny system członkostwa musi umożliwiać logowanie oparte na przekierowaniu do dostawców uwierzytelniania, takich jak Facebook, Twitter i inne.

W miarę rozwoju internetu wzorce tworzenia aplikacji internetowych ewoluowały. Testowanie jednostkowe kodu aplikacji stało się główną kwestią dla deweloperów aplikacji. W 2008 r. ASP.NET dodano nową strukturę opartą na wzorcu MVC (Model-View-Controller), po części ułatwiając deweloperom tworzenie aplikacji do testowania jednostkowego ASP.NET. Deweloperzy, którzy chcieli przetestować logikę aplikacji, również chcieli mieć możliwość wykonania tej czynności w systemie członkostwa.

Biorąc pod uwagę te zmiany w tworzeniu aplikacji internetowych, ASP.NET Identity została opracowana z następującymi celami:

  • Jeden system tożsamości ASP.NET

    • ASP.NET Identity można używać ze wszystkimi strukturami ASP.NET, takimi jak ASP.NET MVC, Web Forms, Web Pages, Web API i SignalR.
    • ASP.NET Identity można używać podczas tworzenia aplikacji internetowych, telefonicznych, sklepowych lub hybrydowych.
  • Łatwość podłączania danych profilu dotyczących użytkownika

    • Masz kontrolę nad schematem informacji o użytkowniku i profilu. Na przykład można łatwo włączyć system do przechowywania dat urodzenia wprowadzonych przez użytkowników podczas rejestrowania konta w aplikacji.
  • Kontrolka trwałości

    • Domyślnie system ASP.NET Identity przechowuje wszystkie informacje o użytkowniku w bazie danych. ASP.NET Identity używa programu Entity Framework Code First do zaimplementowania całego mechanizmu trwałości.
    • Ponieważ kontrolujesz schemat bazy danych, typowe zadania, takie jak zmiana nazw tabel lub zmiana typu danych kluczy podstawowych, jest proste.
    • Łatwo jest podłączyć różne mechanizmy magazynu, takie jak SharePoint, Azure Storage Table Service, bazy danych NoSQL itp., bez konieczności zgłaszania System.NotImplementedExceptions wyjątków.
  • Możliwość testowania jednostkowego

    • ASP.NET Identity sprawia, że aplikacja internetowa jest bardziej testowalna jednostkowa. Możesz pisać testy jednostkowe dla części aplikacji, które używają ASP.NET Identity.
  • Dostawca roli

    • Istnieje dostawca ról, który umożliwia ograniczenie dostępu do części aplikacji według ról. Możesz łatwo tworzyć role, takie jak "Administracja" i dodawać użytkowników do ról.
  • Oparte na oświadczeniach

    • ASP.NET Identity obsługuje uwierzytelnianie oparte na oświadczeniach, gdzie tożsamość użytkownika jest reprezentowana jako zestaw oświadczeń. Oświadczenia pozwalają deweloperom być o wiele bardziej wyraziste w opisywaniu tożsamości użytkownika niż zezwalają na role. Podczas gdy członkostwo w roli jest tylko wartością logiczną (element członkowski lub inny), oświadczenie może zawierać bogate informacje o tożsamości i członkostwie użytkownika.
  • Dostawcy logowania społecznościowego

    • Możesz łatwo dodawać logowania społecznościowe, takie jak konto Microsoft, Facebook, Twitter, Google i inne osoby, oraz przechowywać dane specyficzne dla użytkownika w aplikacji.
  • Integracja OWIN

    • ASP.NET uwierzytelnianie jest teraz oparte na oprogramowaniu pośredniczącym OWIN, które może być używane na dowolnym hoście opartym na protokole OWIN. ASP.NET Identity nie ma żadnej zależności od System.Web. Jest to w pełni zgodna struktura OWIN i może być używana w dowolnej aplikacji hostowanej przez OWIN.
    • ASP.NET Identity używa uwierzytelniania OWIN do logowania/wylogowania użytkowników w witrynie internetowej. Oznacza to, że zamiast używania elementu FormsAuthentication do wygenerowania pliku cookie aplikacja używa W tym celu protokołu OWIN CookieAuthentication.
  • Pakiet NuGet

    • ASP.NET Identity jest redystrybuowany jako pakiet NuGet, który jest instalowany w ASP.NET MVC, szablonach Web Forms i internetowych interfejsów API, które są dostarczane z programem Visual Studio 2017. Ten pakiet NuGet można pobrać z galerii NuGet.
    • Udostępnienie ASP.NET Identity jako pakietu NuGet ułatwia zespołowi ASP.NET iterowanie nowych funkcji i poprawek usterek oraz dostarczanie ich deweloperom w elastyczny sposób.

Wprowadzenie do usługi ASP.NET Identity

ASP.NET Identity jest używana w szablonach projektów programu Visual Studio 2017 dla ASP.NET MVC, Web Forms, internetowego interfejsu API i SPA. W tym przewodniku zilustrujemy sposób używania szablonów projektów ASP.NET Identity w celu dodania funkcji rejestrowania, logowania i wylogowania użytkownika.

ASP.NET Tożsamość jest implementowana przy użyciu poniższej procedury. Celem tego artykułu jest przedstawienie ogólnego omówienia ASP.NET Identity; Możesz wykonać go krok po kroku lub po prostu przeczytać szczegóły. Aby uzyskać bardziej szczegółowe instrukcje dotyczące tworzenia aplikacji przy użyciu ASP.NET Identity, w tym używania nowego interfejsu API do dodawania użytkowników, ról i informacji o profilu, zobacz sekcję Następne kroki na końcu tego artykułu.

  1. Utwórz aplikację ASP.NET MVC przy użyciu indywidualnych kont. Tożsamości ASP.NET można używać w ASP.NET MVC, Web Forms, internetowym interfejsie API, signalr itp. W tym artykule zaczniemy od aplikacji MVC ASP.NET.

    Obraz przedstawiający nowe okno projektu ASP dot Net

  2. Utworzony projekt zawiera następujące trzy pakiety dla ASP.NET Identity.

    • Microsoft.AspNet.Identity.EntityFramework
      Ten pakiet zawiera implementację platformy Entity Framework ASP.NET Identity, która będzie utrwalać dane i schemat ASP.NET Identity w celu SQL Server.
    • Microsoft.AspNet.Identity.Core
      Ten pakiet zawiera podstawowe interfejsy ASP.NET Identity. Ten pakiet może służyć do pisania implementacji dla ASP.NET Identity, która jest przeznaczona dla różnych magazynów trwałości, takich jak usługa Azure Table Storage, bazy danych NoSQL itp.
    • Microsoft.AspNet.Identity.OWIN
      Ten pakiet zawiera funkcje używane do podłączania uwierzytelniania OWIN z tożsamością ASP.NET w aplikacjach ASP.NET. Jest to używane podczas dodawania funkcji logowania do aplikacji i wywoływania oprogramowania pośredniczącego uwierzytelniania plików cookie OWIN w celu wygenerowania pliku cookie.
  3. Tworzenie użytkownika.
    Uruchom aplikację, a następnie kliknij link Zarejestruj , aby utworzyć użytkownika. Na poniższej ilustracji przedstawiono stronę Rejestrowanie, która zbiera nazwę użytkownika i hasło.

    Obraz przedstawiający tworzenie nowego konta

    Gdy użytkownik wybierze przycisk Zarejestruj , Register akcja kontrolera konta tworzy użytkownika przez wywołanie interfejsu API ASP.NET Identity, jak pokazano poniżej:

    [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. Zaloguj się.
    Jeśli użytkownik został pomyślnie utworzony, jest zalogowany przez metodę 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 generuje wartość ClaimsIdentity. Ponieważ ASP.NET Tożsamość i Uwierzytelnianie plików cookie OWIN są systemem opartym na oświadczeniach, platforma wymaga, aby aplikacja wygenerowała wartość ClaimsIdentity dla użytkownika. ClaimsIdentity zawiera informacje o wszystkich oświadczeniach użytkownika, takich jak role, do których należy użytkownik.

  5. Wyloguj się.
    Wybierz link Wyloguj , aby wywołać akcję LogOff w kontrolerze konta.

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

    Wyróżniony kod powyżej przedstawia metodę OWIN AuthenticationManager.SignOut . Jest to analogia do metody FormsAuthentication.SignOut używanej przez moduł FormsAuthentication w Web Forms.

Składniki ASP.NET Identity

Na poniższym diagramie przedstawiono składniki systemu ASP.NET Identity (wybierz je na tym lub na diagramie, aby go powiększyć). Pakiety w kolorze zielonym tworzą system ASP.NET Identity. Wszystkie pozostałe pakiety są zależnościami, które są potrzebne do korzystania z systemu ASP.NET Identity w aplikacjach ASP.NET.

Diagram przedstawiający składniki systemu tożsamości S P dot Net

Poniżej przedstawiono krótki opis pakietów NuGet, o których nie wspomniano wcześniej:

  • Microsoft.Owin.Security.Cookies
    Oprogramowanie pośredniczące, które umożliwia aplikacji korzystanie z uwierzytelniania opartego na plikach cookie, podobnie jak w przypadku platformy ASP. Uwierzytelnianie formularzy platformy NET.
  • EntityFramework
    Entity Framework to zalecana technologia dostępu do danych firmy Microsoft dla relacyjnych baz danych.

Migrowanie z członkostwa do ASP.NET Identity

Mamy nadzieję, że wkrótce udostępnimy wskazówki dotyczące migracji istniejących aplikacji korzystających z członkostwa ASP.NET lub prostego członkostwa w nowym systemie tożsamości ASP.NET.

Następne kroki