Omówienie uwierzytelniania na platformie ASP.NET Core
Autor: Mike Rousos
Uwierzytelnianie to proces ustalania tożsamości użytkownika. Autoryzacja to proces ustalania, czy użytkownik ma dostęp do zasobu. Na platformie ASP.NET Core uwierzytelnianie jest obsługiwane przez usługę uwierzytelniania IAuthenticationService, która jest używana przez oprogramowanie pośredniczące uwierzytelniania. Usługa uwierzytelniania używa zarejestrowanych procedur obsługi uwierzytelniania, aby wykonywać akcje związane z uwierzytelnianiem. Przykłady akcji związanych z uwierzytelnianiem obejmują:
- Uwierzytelnianie użytkownika.
- Odpowiadanie, gdy nieuwierzytelniony użytkownik próbuje uzyskać dostęp do ograniczonego zasobu.
Zarejestrowane procedury obsługi uwierzytelniania i ich opcje konfiguracji nazywane są „schematami”.
Schematy uwierzytelniania określa się przez zarejestrowanie usług uwierzytelniania w pliku Program.cs
:
- Przez wywołanie metody rozszerzenia specyficznej dla schematu (takiej jak AddJwtBearer lub AddCookie) po wywołaniu metody AddAuthentication. Te metody rozszerzeń używają metody AuthenticationBuilder.AddScheme do rejestrowania schematów z odpowiednimi ustawieniami.
- Rzadziej, przez bezpośrednie wywołanie metody
AuthenticationBuilder.AddScheme
.
Na przykład następujący kod rejestruje usługi uwierzytelniania i procedury obsługi dla schematów uwierzytelniania opartych na plikach cookie i elementach nośnych JWT:
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(JwtBearerDefaults.AuthenticationScheme,
options => builder.Configuration.Bind("JwtSettings", options))
.AddCookie(CookieAuthenticationDefaults.AuthenticationScheme,
options => builder.Configuration.Bind("CookieSettings", options));
W metodzie AddAuthentication
parametr JwtBearerDefaults.AuthenticationScheme jest nazwą schematu, który ma być używany domyślnie, gdy nie zostanie zażądany określony schemat.
Jeśli są używane różne schematy, zasady autoryzacji (lub atrybuty autoryzacji) mogą określać schemat (lub schematy) uwierzytelniania, na którym bazują w celu uwierzytelniania użytkownika. W powyższym przykładzie mógłby zostać użyty schemat uwierzytelniania z użyciem plików cookie przez określenie jego nazwy (domyślnie CookieAuthenticationDefaults.AuthenticationScheme, chociaż przy wywołaniu metody AddCookie
można podać inną nazwę).
W niektórych przypadkach metoda AddAuthentication
jest automatycznie wywoływana przez inne metody rozszerzeń. Na przykład podczas korzystania z funkcji ASP.NET Core Identity metoda AddAuthentication
jest wywoływana wewnętrznie.
Oprogramowanie pośredniczące uwierzytelniania jest dodawane w pliku Program.cs
przez wywołanie metody UseAuthentication. Wywołanie metody UseAuthentication
rejestruje oprogramowanie pośredniczące, które używa wcześniej zarejestrowanych schematów uwierzytelniania. Wywołuj metodę UseAuthentication
przed wszelkim oprogramowaniem pośredniczącym, które jest zależne od uwierzytelniania użytkowników.
Pojęcia dotyczące uwierzytelniania
Funkcja uwierzytelniania jest odpowiedzialna za dostarczenie obiektu ClaimsPrincipal, aby funkcja autoryzacji mogła na tej podstawie podejmować decyzje o uprawnieniach. Istnieje wiele metod opartych na schematach uwierzytelniania, dzięki czemu można wybrać, która procedura obsługi uwierzytelniania jest odpowiedzialna za generowanie właściwego zestawu oświadczeń:
- Schemat uwierzytelniania
- Domyślny schemat uwierzytelniania omówiony w dwóch następnych sekcjach.
- Bezpośrednie ustawianie właściwości HttpContext.User.
Jeśli jest zarejestrowany tylko jeden schemat uwierzytelniania, staje się schematem domyślnym. Jeśli zarejestrowano wiele schematów i nie określono schematu domyślnego, należy określić schemat w atrybucie autoryzacji, w przeciwnym razie zostanie zgłoszony następujący błąd:
InvalidOperationException: Nie podano elementu authenticationScheme i nie znaleziono elementu DefaultAuthenticateScheme. Schematy domyślne można ustawiać za pomocą metody AddAuthentication(string defaultScheme) lub AddAuthentication(Action<AuthenticationOptions> configureOptions).
DefaultScheme
W przypadku zarejestrowania tylko jednego schematu uwierzytelniania pojedynczy schemat uwierzytelniania:
- Jest automatycznie używany jako .DefaultScheme
- Eliminuje konieczność określenia
DefaultScheme
wartości in AddAuthentication(IServiceCollection) lub AddAuthenticationCore(IServiceCollection).
Aby wyłączyć automatycznie przy użyciu schematu pojedynczego uwierzytelniania jako , wywołaj metodę DefaultScheme
AppContext.SetSwitch("Microsoft.AspNetCore.Authentication.SuppressAutoDefaultScheme")
.
Schemat uwierzytelniania
Schemat uwierzytelniania może wybrać, która procedura obsługi uwierzytelniania jest odpowiedzialna za generowanie właściwego zestawu oświadczeń. Aby uzyskać więcej informacji, zobacz Autoryzacja za pomocą określonego schematu.
Schemat uwierzytelniania to nazwa związana z następującymi elementami:
- Procedura obsługi uwierzytelniania.
- Opcje do konfigurowania tego konkretnego wystąpienia procedury obsługi.
Schematy są przydatne jako mechanizm odwoływania się do zachowań dotyczących uwierzytelniania, wezwań i zabronień w skojarzonej procedurze obsługi. Na przykład zasady autoryzacji mogą używać nazw schematów w celu określenia, jaki schemat (lub schematy) uwierzytelniania ma być używany do uwierzytelniania użytkownika. Podczas konfigurowania uwierzytelniania często określa się domyślny schemat uwierzytelniania. Schemat domyślny jest używany, o ile zasób nie zażąda konkretnego schematu. Możliwe jest też:
- Określanie różnych schematów domyślnych, które mają być używane na potrzeby akcji uwierzytelniania, wezwań i zabronień.
- Łączenie wielu schematów w jeden przy użyciu schematów zasad.
Procedura obsługi uwierzytelniania
Procedura obsługi uwierzytelniania:
- Jest typem implementującym zachowanie schematu.
- Pochodzi od typu IAuthenticationHandler lub AuthenticationHandler<TOptions>.
- Odpowiada głównie za uwierzytelnianie użytkowników.
Na podstawie konfiguracji schematu uwierzytelniania i kontekstu przychodzącego żądania procedura obsługi uwierzytelniania:
- Tworzy obiekty AuthenticationTicket reprezentujące tożsamość użytkownika, jeśli uwierzytelnianie powiedzie się.
- Zwraca informację „brak wyniku” lub „niepowodzenie”, jeśli uwierzytelnianie nie powiedzie się.
- W przypadku próby uzyskania dostępu do zasobów należy zakazać akcji w przypadku próby uzyskania dostępu do zasobów przez użytkowników:
- Nie mają oni autoryzacji dostępu (zabronienie).
- Nie są oni uwierzytelnieni (wezwanie).
Klasa RemoteAuthenticationHandler<TOptions>
a klasa AuthenticationHandler<TOptions>
RemoteAuthenticationHandler<TOptions> to klasa uwierzytelniania, która wymaga etapu uwierzytelniania zdalnego. Po zakończeniu etapu uwierzytelniania zdalnego procedura obsługi wykonuje wywołanie zwrotne elementu CallbackPath
ustawionego przez procedurę obsługi. Procedura obsługi kończy etap uwierzytelniania, używając informacji przekazanych do ścieżki wywołania zwrotnego HandleRemoteAuthenticateAsync. Protokoły OAuth 2.0 i OIDC używają tego wzorca. Protokół JWT i funkcja plików cookie nie robią tego, ponieważ mogą bezpośrednio używać nagłówka elementu nośnego i plików cookie do uwierzytelniania. Dostawca hostowany zdalnie w tym przypadku:
- Jest dostawcą uwierzytelniania.
- Przykłady to Facebook, Twitter, Google, Microsoft i każdy inny dostawca OIDC, który obsługuje uwierzytelnianie użytkowników za pomocą mechanizmu procedur obsługi.
Uwierzytelnij
Akcja uwierzytelniania w schemacie uwierzytelniania jest odpowiedzialna za tworzenie tożsamości użytkownika na podstawie kontekstu żądania. Zwraca ona obiekt AuthenticateResult wskazujący, czy uwierzytelnianie powiodło się, a jeśli tak, zwraca tożsamość użytkownika w bilecie uwierzytelniania. Zobacz: AuthenticateAsync. Przykłady uwierzytelniania obejmują:
- Schemat uwierzytelniania cookie tworzący tożsamość użytkownika z plików cookie.
- Schemat z użyciem elementów nośnych JWT deserializujący i weryfikujący token elementu nośnego JWT w celu utworzenia tożsamości użytkownika.
Wyzwanie
Wezwanie do uwierzytelnienia jest wywoływane przez funkcję autoryzacji, gdy nieuwierzytelniony użytkownik żąda punktu końcowego, który wymaga uwierzytelnienia. Wezwanie do uwierzytelnienia jest wysyłane na przykład wtedy, gdy anonimowy użytkownik żąda dostępu do zastrzeżonego zasobu lub używa linku logowania. Funkcja autoryzacji wywołuje wezwanie przy użyciu określonych schematów uwierzytelniania lub schematu domyślnego, jeśli nie określono żadnego schematu. Zobacz: ChallengeAsync. Przykłady wezwań do uwierzytelnienia obejmują:
- Schemat uwierzytelniania z użyciem plików cookie przekierowujący użytkownika na stronę logowania.
- Schemat z użyciem elementów nośnych JWT zwracający wynik 401 z nagłówkiem
www-authenticate: bearer
.
Akcja wezwania powinna powiadamiać użytkownika, jakiego mechanizmu uwierzytelniania należy użyć, aby uzyskać dostęp do żądanego zasobu.
Zabranianie
Akcja zabronienia w schemacie uwierzytelniania jest wywoływana przez funkcję autoryzacji, gdy uwierzytelniony użytkownik próbuje uzyskać dostęp do zasobu, w przypadku którego nie ma zezwolenia. Zobacz: ForbidAsync. Przykłady zabraniania podczas uwierzytelniania obejmują:
- Schemat uwierzytelniania z użyciem plików cookie przekierowujący użytkownika na stronę informującą o zabronieniu dostępu.
- Schemat z użyciem elementów nośnych JWT zwracający wynik 403.
- Niestandardowy schemat uwierzytelniania przekierowujący do strony, na której użytkownik może zażądać dostępu do zasobu.
Akcja zabronienia może przekazać użytkownikowi informacje:
- Został on uwierzytelniony.
- Nie może on uzyskać dostępu do żądanego zasobu.
Skorzystaj z następujących linków, aby poznać różnice między wyzwaniem i zabronieniem:
- Wezwania i zabronienia z operacyjną procedurą obsługi zasobów.
- Różnice między wyzwaniami i zabronieniami.
Dostawcy uwierzytelniania w ramach dzierżawy
Platforma ASP.NET Core nie ma wbudowanego rozwiązania dla uwierzytelniania w wielu dzierżawach. Chociaż klienci mogą napisać jeden przy użyciu wbudowanych funkcji, zalecamy klientom rozważenie uwierzytelniania Sad Core, ABP Framework lub Finbuckle.MultiTenant na potrzeby uwierzytelniania wielodostępnego.
Platforma Orchard Core to:
- Modularna platforma aplikacji typu open source obsługująca wiele dzierżaw i opracowana przy użyciu platformy ASP.NET Core.
- System zarządzania zawartością (CMS) opracowany na bazie tej platformy aplikacji.
Zobacz kod źródłowy platformy Orchard Core, aby uzyskać przykład dostawców uwierzytelniania w ramach dzierżawy.
Platforma ABP Framework obsługuje różne wzorce architektury, w tym modułowość, mikrousługi, projektowanie oparte na domenie oraz wiele dzierżaw. Zobacz Kod źródłowy platformy ABP Framework w serwisie GitHub.
Finbuckle.MultiTenant:
- Technologia open source
- Zapewnia rozpoznawanie dzierżawy
- Lekki
- Zapewnia izolację danych
- Konfigurowanie zachowania aplikacji unikatowo dla każdej dzierżawy
Dodatkowe zasoby
- Autoryzacja przy użyciu określonego schematu na platformie ASP.NET Core
- Schematy zasad na platformie ASP.NET Core
- Tworzenie aplikacji platformy ASP.NET Core przy użyciu danych użytkowników chronionych przez autoryzację
- Globalne wymaganie uwierzytelnionych użytkowników
- Problem w serwisie GitHub dotyczący używania wielu schematów uwierzytelniania
Autor: Mike Rousos
Uwierzytelnianie to proces ustalania tożsamości użytkownika. Autoryzacja to proces ustalania, czy użytkownik ma dostęp do zasobu. Na platformie ASP.NET Core uwierzytelnianie jest obsługiwane przez usługę uwierzytelniania IAuthenticationService, która jest używana przez oprogramowanie pośredniczące uwierzytelniania. Usługa uwierzytelniania używa zarejestrowanych procedur obsługi uwierzytelniania, aby wykonywać akcje związane z uwierzytelnianiem. Przykłady akcji związanych z uwierzytelnianiem obejmują:
- Uwierzytelnianie użytkownika.
- Odpowiadanie, gdy nieuwierzytelniony użytkownik próbuje uzyskać dostęp do ograniczonego zasobu.
Zarejestrowane procedury obsługi uwierzytelniania i ich opcje konfiguracji nazywane są „schematami”.
Schematy uwierzytelniania określa się przez zarejestrowanie usług uwierzytelniania w pliku Program.cs
:
- Przez wywołanie metody rozszerzenia specyficznej dla schematu (takiej jak AddJwtBearer lub AddCookie) po wywołaniu metody AddAuthentication. Te metody rozszerzeń używają metody AuthenticationBuilder.AddScheme do rejestrowania schematów z odpowiednimi ustawieniami.
- Rzadziej, przez bezpośrednie wywołanie metody
AuthenticationBuilder.AddScheme
.
Na przykład następujący kod rejestruje usługi uwierzytelniania i procedury obsługi dla schematów uwierzytelniania opartych na plikach cookie i elementach nośnych JWT:
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(JwtBearerDefaults.AuthenticationScheme,
options => builder.Configuration.Bind("JwtSettings", options))
.AddCookie(CookieAuthenticationDefaults.AuthenticationScheme,
options => builder.Configuration.Bind("CookieSettings", options));
W metodzie AddAuthentication
parametr JwtBearerDefaults.AuthenticationScheme jest nazwą schematu, który ma być używany domyślnie, gdy nie zostanie zażądany określony schemat.
Jeśli są używane różne schematy, zasady autoryzacji (lub atrybuty autoryzacji) mogą określać schemat (lub schematy) uwierzytelniania, na którym bazują w celu uwierzytelniania użytkownika. W powyższym przykładzie mógłby zostać użyty schemat uwierzytelniania z użyciem plików cookie przez określenie jego nazwy (domyślnie CookieAuthenticationDefaults.AuthenticationScheme, chociaż przy wywołaniu metody AddCookie
można podać inną nazwę).
W niektórych przypadkach metoda AddAuthentication
jest automatycznie wywoływana przez inne metody rozszerzeń. Na przykład podczas korzystania z funkcji ASP.NET Core Identity metoda AddAuthentication
jest wywoływana wewnętrznie.
Oprogramowanie pośredniczące uwierzytelniania jest dodawane w pliku Program.cs
przez wywołanie metody UseAuthentication. Wywołanie metody UseAuthentication
rejestruje oprogramowanie pośredniczące, które używa wcześniej zarejestrowanych schematów uwierzytelniania. Wywołuj metodę UseAuthentication
przed wszelkim oprogramowaniem pośredniczącym, które jest zależne od uwierzytelniania użytkowników.
Pojęcia dotyczące uwierzytelniania
Funkcja uwierzytelniania jest odpowiedzialna za dostarczenie obiektu ClaimsPrincipal, aby funkcja autoryzacji mogła na tej podstawie podejmować decyzje o uprawnieniach. Istnieje wiele metod opartych na schematach uwierzytelniania, dzięki czemu można wybrać, która procedura obsługi uwierzytelniania jest odpowiedzialna za generowanie właściwego zestawu oświadczeń:
- Schemat uwierzytelniania
- Domyślny schemat uwierzytelniania, omówiony w następnej sekcji.
- Bezpośrednie ustawianie właściwości HttpContext.User.
Nie ma automatycznego sondowania schematów. Jeśli schemat domyślny nie zostanie określony, należy określić schemat w atrybucie Authorize. W przeciwnym razie zostanie zgłoszony następujący błąd:
InvalidOperationException: Nie podano elementu authenticationScheme i nie znaleziono elementu DefaultAuthenticateScheme. Schematy domyślne można ustawiać za pomocą metody AddAuthentication(string defaultScheme) lub AddAuthentication(Action<AuthenticationOptions> configureOptions).
Schemat uwierzytelniania
Schemat uwierzytelniania może wybrać, która procedura obsługi uwierzytelniania jest odpowiedzialna za generowanie właściwego zestawu oświadczeń. Aby uzyskać więcej informacji, zobacz Autoryzacja za pomocą określonego schematu.
Schemat uwierzytelniania to nazwa związana z następującymi elementami:
- Procedura obsługi uwierzytelniania.
- Opcje do konfigurowania tego konkretnego wystąpienia procedury obsługi.
Schematy są przydatne jako mechanizm odwoływania się do zachowań dotyczących uwierzytelniania, wezwań i zabronień w skojarzonej procedurze obsługi. Na przykład zasady autoryzacji mogą używać nazw schematów w celu określenia, jaki schemat (lub schematy) uwierzytelniania ma być używany do uwierzytelniania użytkownika. Podczas konfigurowania uwierzytelniania często określa się domyślny schemat uwierzytelniania. Schemat domyślny jest używany, o ile zasób nie zażąda konkretnego schematu. Możliwe jest też:
- Określanie różnych schematów domyślnych, które mają być używane na potrzeby akcji uwierzytelniania, wezwań i zabronień.
- Łączenie wielu schematów w jeden przy użyciu schematów zasad.
Procedura obsługi uwierzytelniania
Procedura obsługi uwierzytelniania:
- Jest typem implementującym zachowanie schematu.
- Pochodzi od typu IAuthenticationHandler lub AuthenticationHandler<TOptions>.
- Odpowiada głównie za uwierzytelnianie użytkowników.
Na podstawie konfiguracji schematu uwierzytelniania i kontekstu przychodzącego żądania procedura obsługi uwierzytelniania:
- Tworzy obiekty AuthenticationTicket reprezentujące tożsamość użytkownika, jeśli uwierzytelnianie powiedzie się.
- Zwraca informację „brak wyniku” lub „niepowodzenie”, jeśli uwierzytelnianie nie powiedzie się.
- W przypadku próby uzyskania dostępu do zasobów należy zakazać akcji w przypadku próby uzyskania dostępu do zasobów przez użytkowników:
- Nie mają oni autoryzacji dostępu (zabronienie).
- Nie są oni uwierzytelnieni (wezwanie).
Klasa RemoteAuthenticationHandler<TOptions>
a klasa AuthenticationHandler<TOptions>
RemoteAuthenticationHandler<TOptions> to klasa uwierzytelniania, która wymaga etapu uwierzytelniania zdalnego. Po zakończeniu etapu uwierzytelniania zdalnego procedura obsługi wykonuje wywołanie zwrotne elementu CallbackPath
ustawionego przez procedurę obsługi. Procedura obsługi kończy etap uwierzytelniania, używając informacji przekazanych do ścieżki wywołania zwrotnego HandleRemoteAuthenticateAsync. Protokoły OAuth 2.0 i OIDC używają tego wzorca. Protokół JWT i funkcja plików cookie nie robią tego, ponieważ mogą bezpośrednio używać nagłówka elementu nośnego i plików cookie do uwierzytelniania. Dostawca hostowany zdalnie w tym przypadku:
- Jest dostawcą uwierzytelniania.
- Przykłady to Facebook, Twitter, Google, Microsoft i każdy inny dostawca OIDC, który obsługuje uwierzytelnianie użytkowników za pomocą mechanizmu procedur obsługi.
Uwierzytelnij
Akcja uwierzytelniania w schemacie uwierzytelniania jest odpowiedzialna za tworzenie tożsamości użytkownika na podstawie kontekstu żądania. Zwraca ona obiekt AuthenticateResult wskazujący, czy uwierzytelnianie powiodło się, a jeśli tak, zwraca tożsamość użytkownika w bilecie uwierzytelniania. Zobacz: AuthenticateAsync. Przykłady uwierzytelniania obejmują:
- Schemat uwierzytelniania cookie tworzący tożsamość użytkownika z plików cookie.
- Schemat z użyciem elementów nośnych JWT deserializujący i weryfikujący token elementu nośnego JWT w celu utworzenia tożsamości użytkownika.
Wyzwanie
Wezwanie do uwierzytelnienia jest wywoływane przez funkcję autoryzacji, gdy nieuwierzytelniony użytkownik żąda punktu końcowego, który wymaga uwierzytelnienia. Wezwanie do uwierzytelnienia jest wysyłane na przykład wtedy, gdy anonimowy użytkownik żąda dostępu do zastrzeżonego zasobu lub używa linku logowania. Funkcja autoryzacji wywołuje wezwanie przy użyciu określonych schematów uwierzytelniania lub schematu domyślnego, jeśli nie określono żadnego schematu. Zobacz: ChallengeAsync. Przykłady wezwań do uwierzytelnienia obejmują:
- Schemat uwierzytelniania z użyciem plików cookie przekierowujący użytkownika na stronę logowania.
- Schemat z użyciem elementów nośnych JWT zwracający wynik 401 z nagłówkiem
www-authenticate: bearer
.
Akcja wezwania powinna powiadamiać użytkownika, jakiego mechanizmu uwierzytelniania należy użyć, aby uzyskać dostęp do żądanego zasobu.
Zabranianie
Akcja zabronienia w schemacie uwierzytelniania jest wywoływana przez funkcję autoryzacji, gdy uwierzytelniony użytkownik próbuje uzyskać dostęp do zasobu, w przypadku którego nie ma zezwolenia. Zobacz: ForbidAsync. Przykłady zabraniania podczas uwierzytelniania obejmują:
- Schemat uwierzytelniania z użyciem plików cookie przekierowujący użytkownika na stronę informującą o zabronieniu dostępu.
- Schemat z użyciem elementów nośnych JWT zwracający wynik 403.
- Niestandardowy schemat uwierzytelniania przekierowujący do strony, na której użytkownik może zażądać dostępu do zasobu.
Akcja zabronienia może przekazać użytkownikowi informacje:
- Został on uwierzytelniony.
- Nie może on uzyskać dostępu do żądanego zasobu.
Skorzystaj z następujących linków, aby poznać różnice między wyzwaniem i zabronieniem:
- Wezwania i zabronienia z operacyjną procedurą obsługi zasobów.
- Różnice między wyzwaniami i zabronieniami.
Dostawcy uwierzytelniania w ramach dzierżawy
Platforma ASP.NET Core nie ma wbudowanego rozwiązania dla uwierzytelniania w wielu dzierżawach. Chociaż klienci mogą je opracować przy użyciu wbudowanych funkcji, zalecamy klientom rozważenie użycia platformy Orchard Core lub ABP Framework do uwierzytelniania w wielu dzierżawach.
Platforma Orchard Core to:
- Modularna platforma aplikacji typu open source obsługująca wiele dzierżaw i opracowana przy użyciu platformy ASP.NET Core.
- System zarządzania zawartością (CMS) opracowany na bazie tej platformy aplikacji.
Zobacz kod źródłowy platformy Orchard Core, aby uzyskać przykład dostawców uwierzytelniania w ramach dzierżawy.
Platforma ABP Framework obsługuje różne wzorce architektury, w tym modułowość, mikrousługi, projektowanie oparte na domenie oraz wiele dzierżaw. Zobacz Kod źródłowy platformy ABP Framework w serwisie GitHub.
Dodatkowe zasoby
- Autoryzacja przy użyciu określonego schematu na platformie ASP.NET Core
- Schematy zasad na platformie ASP.NET Core
- Tworzenie aplikacji platformy ASP.NET Core przy użyciu danych użytkowników chronionych przez autoryzację
- Globalne wymaganie uwierzytelnionych użytkowników
- Problem w serwisie GitHub dotyczący używania wielu schematów uwierzytelniania
Autor: Mike Rousos
Uwierzytelnianie to proces ustalania tożsamości użytkownika. Autoryzacja to proces ustalania, czy użytkownik ma dostęp do zasobu. Na platformie ASP.NET Core uwierzytelnianie jest obsługiwane przez usługę uwierzytelniania IAuthenticationService, która jest używana przez oprogramowanie pośredniczące uwierzytelniania. Usługa uwierzytelniania używa zarejestrowanych procedur obsługi uwierzytelniania, aby wykonywać akcje związane z uwierzytelnianiem. Przykłady akcji związanych z uwierzytelnianiem obejmują:
- Uwierzytelnianie użytkownika.
- Odpowiadanie, gdy nieuwierzytelniony użytkownik próbuje uzyskać dostęp do ograniczonego zasobu.
Zarejestrowane procedury obsługi uwierzytelniania i ich opcje konfiguracji nazywane są „schematami”.
Schematy uwierzytelniania określa się przez zarejestrowanie usług uwierzytelniania w pliku Startup.ConfigureServices
:
- Przez wywołanie metody rozszerzenia specyficznej dla schematu (takiej jak AddJwtBearer lub AddCookie) po wywołaniu metody AddAuthentication. Te metody rozszerzeń używają metody AuthenticationBuilder.AddScheme do rejestrowania schematów z odpowiednimi ustawieniami.
- Rzadziej, przez bezpośrednie wywołanie metody
AuthenticationBuilder.AddScheme
.
Na przykład następujący kod rejestruje usługi uwierzytelniania i procedury obsługi dla schematów uwierzytelniania opartych na plikach cookie i elementach nośnych JWT:
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(JwtBearerDefaults.AuthenticationScheme,
options => Configuration.Bind("JwtSettings", options))
.AddCookie(CookieAuthenticationDefaults.AuthenticationScheme,
options => Configuration.Bind("CookieSettings", options));
W metodzie AddAuthentication
parametr JwtBearerDefaults.AuthenticationScheme jest nazwą schematu, który ma być używany domyślnie, gdy nie zostanie zażądany określony schemat.
Jeśli są używane różne schematy, zasady autoryzacji (lub atrybuty autoryzacji) mogą określać schemat (lub schematy) uwierzytelniania, na którym bazują w celu uwierzytelniania użytkownika. W powyższym przykładzie mógłby zostać użyty schemat uwierzytelniania z użyciem plików cookie przez określenie jego nazwy (domyślnie CookieAuthenticationDefaults.AuthenticationScheme, chociaż przy wywołaniu metody AddCookie
można podać inną nazwę).
W niektórych przypadkach metoda AddAuthentication
jest automatycznie wywoływana przez inne metody rozszerzeń. Na przykład podczas korzystania z funkcji ASP.NET Core Identity metoda AddAuthentication
jest wywoływana wewnętrznie.
Oprogramowanie pośredniczące uwierzytelniania jest dodawane w pliku Startup.Configure
przez wywołanie metody UseAuthentication. Wywołanie metody UseAuthentication
rejestruje oprogramowanie pośredniczące, które używa wcześniej zarejestrowanych schematów uwierzytelniania. Wywołuj metodę UseAuthentication
przed wszelkim oprogramowaniem pośredniczącym, które jest zależne od uwierzytelniania użytkowników. W przypadku korzystania z routingu punktów końcowych wywołanie metody UseAuthentication
musi znajdować się:
- Po metodzie UseRouting, aby informacje o trasach były dostępne do podejmowania decyzji dotyczących uwierzytelniania.
- Przed metodą UseEndpoints, aby użytkownicy byli uwierzytelniani przed uzyskaniem dostępu do punktów końcowych.
Pojęcia dotyczące uwierzytelniania
Funkcja uwierzytelniania jest odpowiedzialna za dostarczenie obiektu ClaimsPrincipal, aby funkcja autoryzacji mogła na tej podstawie podejmować decyzje o uprawnieniach. Istnieje wiele metod opartych na schematach uwierzytelniania, dzięki czemu można wybrać, która procedura obsługi uwierzytelniania jest odpowiedzialna za generowanie właściwego zestawu oświadczeń:
- Schemat uwierzytelniania
- Domyślny schemat uwierzytelniania, omówiony w następnej sekcji.
- Bezpośrednie ustawianie właściwości HttpContext.User.
Nie ma automatycznego sondowania schematów. Jeśli schemat domyślny nie zostanie określony, należy określić schemat w atrybucie Authorize. W przeciwnym razie zostanie zgłoszony następujący błąd:
InvalidOperationException: Nie podano elementu authenticationScheme i nie znaleziono elementu DefaultAuthenticateScheme. Schematy domyślne można ustawiać za pomocą metody AddAuthentication(string defaultScheme) lub AddAuthentication(Action<AuthenticationOptions> configureOptions).
Schemat uwierzytelniania
Schemat uwierzytelniania może wybrać, która procedura obsługi uwierzytelniania jest odpowiedzialna za generowanie właściwego zestawu oświadczeń. Aby uzyskać więcej informacji, zobacz Autoryzacja za pomocą określonego schematu.
Schemat uwierzytelniania to nazwa związana z następującymi elementami:
- Procedura obsługi uwierzytelniania.
- Opcje do konfigurowania tego konkretnego wystąpienia procedury obsługi.
Schematy są przydatne jako mechanizm odwoływania się do zachowań dotyczących uwierzytelniania, wezwań i zabronień w skojarzonej procedurze obsługi. Na przykład zasady autoryzacji mogą używać nazw schematów w celu określenia, jaki schemat (lub schematy) uwierzytelniania ma być używany do uwierzytelniania użytkownika. Podczas konfigurowania uwierzytelniania często określa się domyślny schemat uwierzytelniania. Schemat domyślny jest używany, o ile zasób nie zażąda konkretnego schematu. Możliwe jest też:
- Określanie różnych schematów domyślnych, które mają być używane na potrzeby akcji uwierzytelniania, wezwań i zabronień.
- Łączenie wielu schematów w jeden przy użyciu schematów zasad.
Procedura obsługi uwierzytelniania
Procedura obsługi uwierzytelniania:
- Jest typem implementującym zachowanie schematu.
- Pochodzi od typu IAuthenticationHandler lub AuthenticationHandler<TOptions>.
- Odpowiada głównie za uwierzytelnianie użytkowników.
Na podstawie konfiguracji schematu uwierzytelniania i kontekstu przychodzącego żądania procedura obsługi uwierzytelniania:
- Tworzy obiekty AuthenticationTicket reprezentujące tożsamość użytkownika, jeśli uwierzytelnianie powiedzie się.
- Zwraca informację „brak wyniku” lub „niepowodzenie”, jeśli uwierzytelnianie nie powiedzie się.
- W przypadku próby uzyskania dostępu do zasobów należy zakazać akcji w przypadku próby uzyskania dostępu do zasobów przez użytkowników:
- Nie mają oni autoryzacji dostępu (zabronienie).
- Nie są oni uwierzytelnieni (wezwanie).
Klasa RemoteAuthenticationHandler<TOptions>
a klasa AuthenticationHandler<TOptions>
RemoteAuthenticationHandler<TOptions> to klasa uwierzytelniania, która wymaga etapu uwierzytelniania zdalnego. Po zakończeniu etapu uwierzytelniania zdalnego procedura obsługi wykonuje wywołanie zwrotne elementu CallbackPath
ustawionego przez procedurę obsługi. Procedura obsługi kończy etap uwierzytelniania, używając informacji przekazanych do ścieżki wywołania zwrotnego HandleRemoteAuthenticateAsync. Protokoły OAuth 2.0 i OIDC używają tego wzorca. Protokół JWT i funkcja plików cookie nie robią tego, ponieważ mogą bezpośrednio używać nagłówka elementu nośnego i plików cookie do uwierzytelniania. Dostawca hostowany zdalnie w tym przypadku:
- Jest dostawcą uwierzytelniania.
- Przykłady to Facebook, Twitter, Google, Microsoft i każdy inny dostawca OIDC, który obsługuje uwierzytelnianie użytkowników za pomocą mechanizmu procedur obsługi.
Uwierzytelnij
Akcja uwierzytelniania w schemacie uwierzytelniania jest odpowiedzialna za tworzenie tożsamości użytkownika na podstawie kontekstu żądania. Zwraca ona obiekt AuthenticateResult wskazujący, czy uwierzytelnianie powiodło się, a jeśli tak, zwraca tożsamość użytkownika w bilecie uwierzytelniania. Zobacz: AuthenticateAsync. Przykłady uwierzytelniania obejmują:
- Schemat uwierzytelniania cookie tworzący tożsamość użytkownika z plików cookie.
- Schemat z użyciem elementów nośnych JWT deserializujący i weryfikujący token elementu nośnego JWT w celu utworzenia tożsamości użytkownika.
Wyzwanie
Wezwanie do uwierzytelnienia jest wywoływane przez funkcję autoryzacji, gdy nieuwierzytelniony użytkownik żąda punktu końcowego, który wymaga uwierzytelnienia. Wezwanie do uwierzytelnienia jest wysyłane na przykład wtedy, gdy anonimowy użytkownik żąda dostępu do zastrzeżonego zasobu lub używa linku logowania. Funkcja autoryzacji wywołuje wezwanie przy użyciu określonych schematów uwierzytelniania lub schematu domyślnego, jeśli nie określono żadnego schematu. Zobacz: ChallengeAsync. Przykłady wezwań do uwierzytelnienia obejmują:
- Schemat uwierzytelniania z użyciem plików cookie przekierowujący użytkownika na stronę logowania.
- Schemat z użyciem elementów nośnych JWT zwracający wynik 401 z nagłówkiem
www-authenticate: bearer
.
Akcja wezwania powinna powiadamiać użytkownika, jakiego mechanizmu uwierzytelniania należy użyć, aby uzyskać dostęp do żądanego zasobu.
Zabranianie
Akcja zabronienia w schemacie uwierzytelniania jest wywoływana przez funkcję autoryzacji, gdy uwierzytelniony użytkownik próbuje uzyskać dostęp do zasobu, w przypadku którego nie ma zezwolenia. Zobacz: ForbidAsync. Przykłady zabraniania podczas uwierzytelniania obejmują:
- Schemat uwierzytelniania z użyciem plików cookie przekierowujący użytkownika na stronę informującą o zabronieniu dostępu.
- Schemat z użyciem elementów nośnych JWT zwracający wynik 403.
- Niestandardowy schemat uwierzytelniania przekierowujący do strony, na której użytkownik może zażądać dostępu do zasobu.
Akcja zabronienia może przekazać użytkownikowi informacje:
- Został on uwierzytelniony.
- Nie może on uzyskać dostępu do żądanego zasobu.
Skorzystaj z następujących linków, aby poznać różnice między wyzwaniem i zabronieniem:
- Wezwania i zabronienia z operacyjną procedurą obsługi zasobów.
- Różnice między wyzwaniami i zabronieniami.
Dostawcy uwierzytelniania w ramach dzierżawy
Platforma ASP.NET Core nie ma wbudowanego rozwiązania dla uwierzytelniania w wielu dzierżawach. Chociaż klienci mogą opracowywać aplikacje z uwierzytelnianiem w wielu dzierżawach, zalecamy używanie jednej z następujących platform aplikacji ASP.NET Core, które obsługują uwierzytelnianie w wielu dzierżawach:
Orchard Core
Orchard Core. Zobacz kod źródłowy platformy Orchard Core, aby uzyskać przykład dostawców uwierzytelniania w ramach dzierżawy.
ABP Framework
Platforma ABP Framework obsługuje różne wzorce architektury, w tym modułowość, mikrousługi, projektowanie oparte na domenie oraz wiele dzierżaw. Zobacz Kod źródłowy platformy ABP Framework w serwisie GitHub.
Dodatkowe zasoby
- Autoryzacja przy użyciu określonego schematu na platformie ASP.NET Core
- Schematy zasad na platformie ASP.NET Core
- Tworzenie aplikacji platformy ASP.NET Core przy użyciu danych użytkowników chronionych przez autoryzację
- Globalne wymaganie uwierzytelnionych użytkowników
- Problem w serwisie GitHub dotyczący używania wielu schematów uwierzytelniania