Udostępnij za pośrednictwem


Wprowadzenie do ASP.NET Identity

System członkostwa ASP.NET został wprowadzony 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że spojrzenie na to, co powinien być system członkostwa podczas tworzenia nowoczesnych aplikacji dla internetu, telefonu lub tabletu.

Zalecamy użycie najbezpieczniejszej opcji bezpiecznego uwierzytelniania. W przypadku aplikacji platformy .NET wdrożonych na platformie Azure zobacz:

Usługa Azure Key Vault i .NET Aspire zapewniają najbezpieczniejszy sposób przechowywania i pobierania sekretów. Azure Key Vault to usługa w chmurze, która chroni klucze szyfrowania i wpisy tajne, takie jak certyfikaty, parametry połączenia i hasła. Aby zapoznać się z programem .NET Aspire, sprawdź Bezpieczna komunikacja między hostingiem a integracjami klientów.

Unikaj metody przyznawania dostępu za pomocą hasła właściciela zasobu, ponieważ:

  • Uwidacznia hasło użytkownika klientowi.
  • Jest istotnym zagrożeniem bezpieczeństwa.
  • Należy używać tylko wtedy, gdy inne przepływy uwierzytelniania nie są możliwe.

Po wdrożeniu aplikacji na serwerze testowym zmienna środowiskowa może służyć do ustawiania parametrów połączenia na testowy serwer bazy danych. Zmienne środowiskowe są zwykle przechowywane w postaci zwykłego, niezaszyfrowanego tekstu. W przypadku naruszenia zabezpieczeń maszyny lub procesu zmienne środowiskowe mogą być dostępne dla niezaufanych stron. Odradzamy używanie zmiennych środowiskowych do przechowywania parametrów połączenia produkcyjnego, ponieważ nie jest to najbezpieczniejsze podejście.

Wytyczne dotyczące danych konfiguracji:

  • Nigdy nie przechowuj haseł ani innych poufnych danych w kodzie dostawcy konfiguracji ani w plikach konfiguracji zwykłego tekstu.
  • Nie używaj tajemnic produkcyjnych w środowiskach deweloperskich ani testowych.
  • Określ tajne informacje poza projektem, aby nie mogły zostać przypadkowo zatwierdzone w repozytorium kodu źródłowego.

Tło: członkostwo w ASP.NET

członkostwo w usłudze ASP.NET

ASP.NET Membership zostało zaprojektowane w celu rozwiązania wymagań dotyczących członkostwa w witrynie, które były powszechne w 2005 r., obejmujących uwierzytelnianie formularzy i 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 dla programu 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 System.NotImplementedException wyjątków dla metod, które nie mają zastosowania do baz danych NoSQL.
  • Ponieważ funkcja logowania/wylogowania jest oparta na uwierzytelnianiu formularzy, system członkostwa nie może używać 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 lokalnej usługi Active Directory lub usługi Azure Active Directory. OWIN obejmuje również obsługę protokołu OAuth 2.0, JWT i CORS.

ASP.NET proste członkostwo

ASP.NET Simple Membership został opracowany jako system członkostwa dla ASP.NET Web Pages. Została wydana z WebMatrix i 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 dostosowywanie informacji o profilu użytkownika, ale nadal napotyka te same problemy co członkostwo ASP.NET i ma pewne ograniczenia:"

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

ASP.NET Uniwersalni Dostawcy

ASP.NET Universal Providers zostały opracowane, aby umożliwić utrwalanie informacji o członkostwie w Microsoft Azure SQL Database, a także współpracę 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ł znacznie uproszczony.

Dostawcy uniwersalni są zbudowani 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 dostosować informacje o profilu i użytkownikach. Ci dostawcy nadal używają uwierzytelniania za pomocą formularzy do celów logowania i wylogowywania.

ASP.NET Identity

Ponieważ historia członkostwa w ASP.NET ewoluowała od lat, zespół ASP.NET wiele nauczył się 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 w mediach społecznościowych, aby mogli mieć bogate doświadczenie na swoich witrynach internetowych. Nowoczesny system członkostwa musi umożliwić logowanie oparte na przekierowaniu do dostawców uwierzytelniania, takich jak Facebook, Twitter i inne.

W miarę jak ewoluowało tworzenie stron internetowych, ewoluowały też wzorce tego tworzenia. Testowanie jednostkowe kodu aplikacji stało się podstawowym problemem dla deweloperów aplikacji. W 2008 r. ASP.NET dodano nową strukturę opartą na wzorcu model-View-Controller (MVC), po części ułatwiając deweloperom tworzenie aplikacji testowalnych ASP.NET jednostkowych. Deweloperzy, którzy chcieli przetestować logikę aplikacji, chcieli również 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ło opracowane z następującymi celami:

  • Jeden system tożsamości ASP.NET

    • ASP.NET Identity można używać ze wszystkimi platformami 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ść wprowadzania danych profilu użytkownika

    • Masz kontrolę nad schematem informacji o użytkowniku i profilu. Można na przykład łatwo włączyć system do przechowywania dat urodzenia wprowadzonych przez użytkowników podczas rejestrowania konta w aplikacji.
  • Kontrola 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 magazynowania, takie jak SharePoint, Azure Storage Table Service, bazy danych NoSQL itp., bez konieczności zgłaszania wyjątków System.NotImplementedExceptions.
  • Testowalność testów jednostkowych

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

    • 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 "Administrator" 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 wyrazistymi w opisywaniu tożsamości użytkownika niż pozwalają na to role. Mając na uwadze, że członkostwo w roli jest tylko wartością logiczną (członkiem lub nieczłonkową), 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 za pomocą serwisów społecznościowych, takich jak konto Microsoft, Facebook, Twitter, Google i inne, oraz przechowywać dane specyficzne dla użytkownika w swojej 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 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 firmę OWIN.
    • ASP.NET Identity używa OWIN do logowania i wylogowywania użytkowników na stronie internetowej. Oznacza to, że zamiast używania protokołu FormsAuthentication do wygenerowania pliku cookie aplikacja używa protokołu OWIN CookieAuthentication w tym celu.
  • pakiet NuGet

    • ASP.NET Identity jest redystrybuowany jako pakiet NuGet instalowany w szablonach ASP.NET MVC, Web Forms i Web 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żywany w szablonach projektów programu Visual Studio 2017 dla ASP.NET MVC, Web Forms, Web 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 Identity jest implementowana przy użyciu poniższej procedury. Celem tego artykułu jest przedstawienie ogólnego przeglądu 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 usługi 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 usługach ASP.NET MVC, Web Forms, Web API, SignalR itp. W tym artykule zaczniemy od aplikacji ASP.NET MVC.

    Obraz nowego okna 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 tożsamości ASP.NET do programu 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 do różnych systemów przechowywania danych, takich jak Azure Table Storage, bazy danych NoSQL i inne.
    • 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, akcja Register 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żytkowniczka została pomyślnie utworzona, zostaje zalogowana przy użyciu 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 generuje ClaimsIdentity. Ponieważ ASP.NET Identity i OWIN Cookie Authentication to system oparty na roszczeniach, framework wymaga, aby aplikacja wygenerowała identyfikator 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 się, aby wywołać akcję Wyloguj 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 formularzach sieci Web.

Składniki ASP.NET Identity

Na poniższym diagramie przedstawiono składniki systemu ASP.NET Identity (kliknij na ten lub kliknij na diagram, 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 ASP.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 uwierzytelnienia na podstawie plików cookie, podobnie jak uwierzytelnianie formularzy w ASP.NET.
  • EntityFramework
    Entity Framework to zalecana technologia dostępu do danych firmy Microsoft dla relacyjnych baz danych.

Migrowanie z członkostwa do tożsamości ASP.NET

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