Zabezpieczanie aplikacji po stronie Blazor serwera ASP.NET Core
Uwaga
Nie jest to najnowsza wersja tego artykułu. Aby zapoznać się z bieżącą wersją, zapoznaj się z wersją tego artykułu platformy .NET 8.
Ostrzeżenie
Ta wersja ASP.NET Core nie jest już obsługiwana. Aby uzyskać więcej informacji, zobacz .NET i .NET Core Support Policy (Zasady obsługi platformy .NET Core). Aby zapoznać się z bieżącą wersją, zapoznaj się z wersją tego artykułu platformy .NET 8.
Ważne
Te informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany, zanim zostanie wydany komercyjnie. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Aby zapoznać się z bieżącą wersją, zapoznaj się z wersją tego artykułu platformy .NET 8.
W tym artykule wyjaśniono, jak zabezpieczyć aplikacje po stronie Blazor serwera jako aplikacje ASP.NET Core.
Aplikacje po stronie Blazor serwera są konfigurowane pod kątem zabezpieczeń w taki sam sposób jak aplikacje ASP.NET Core. Aby uzyskać więcej informacji, zobacz artykuły w tematach dotyczących zabezpieczeń platformy ASP.NET Core.
Kontekst uwierzytelniania jest ustanawiany tylko po uruchomieniu aplikacji, czyli wtedy, gdy aplikacja najpierw nawiązuje połączenie z protokołem WebSocket. Kontekst uwierzytelniania jest utrzymywany przez cały okres istnienia obwodu. Aplikacje okresowo ponownie weryfikują stan uwierzytelniania użytkownika, obecnie co 30 minut.
Jeśli aplikacja musi przechwytywać użytkowników dla usług niestandardowych lub reagować na aktualizacje użytkownika, zobacz Scenariusze zabezpieczeń po stronie serwera ASP.NET CoreBlazor.
Blazor różni się od tradycyjnych aplikacji internetowych renderowanych na serwerze, które tworzą nowe żądania HTTP z cookies na każdej nawigacji strony. Uwierzytelnianie jest sprawdzane podczas zdarzeń nawigacji. Jednak cookienie są zaangażowane. Cookies są wysyłane tylko podczas wysyłania żądania HTTP do serwera, co nie jest wykonywane po przejściu Blazor użytkownika w aplikacji. Podczas nawigacji stan uwierzytelniania użytkownika jest sprawdzany w obwodzie Blazor , który można aktualizować w dowolnym momencie na serwerze przy użyciu RevalidatingAuthenticationStateProvider
abstrakcji.
Ważne
Implementowanie niestandardowego NavigationManager
elementu w celu uzyskania weryfikacji uwierzytelniania podczas nawigacji nie jest zalecane. Jeśli aplikacja musi wykonywać niestandardową logikę stanu uwierzytelniania podczas nawigacji, użyj niestandardowego AuthenticationStateProvider
elementu .
Uwaga
Przykłady kodu w tym artykule przyjmują typy odwołań dopuszczających wartość null (NRTs) i statyczną analizę stanu null kompilatora platformy .NET, które są obsługiwane w programie ASP.NET Core na platformie .NET 6 lub nowszym. W przypadku określania wartości docelowej ASP.NET Core 5.0 lub starszej usuń oznaczenie typu null (?
) z przykładów w tym artykule.
Szablon projektu
Utwórz nową aplikację po stronie Blazor serwera, postępując zgodnie ze wskazówkami w temacie Tooling for ASP.NET Core Blazor.
Po wybraniu szablonu aplikacji po stronie serwera i skonfigurowaniu projektu wybierz uwierzytelnianie aplikacji w obszarze Typ uwierzytelniania:
- Brak (wartość domyślna): brak uwierzytelniania.
- Indywidualne konta: konta użytkowników są przechowywane w aplikacji przy użyciu ASP.NET Core Identity.
- Brak (wartość domyślna): brak uwierzytelniania.
- Indywidualne konta: konta użytkowników są przechowywane w aplikacji przy użyciu ASP.NET Core Identity.
- Platforma tożsamości Microsoft: Aby uzyskać więcej informacji, zobacz ASP.NET Core authentication and authorization (Uwierzytelnianie i autoryzacja podstawowe ASP.NET CoreBlazor).
- Windows: użyj uwierzytelniania systemu Windows.
BlazorIdentity Interfejs użytkownika (indywidualne konta)
Blazorprogram obsługuje generowanie pełnego BlazorIdentity interfejsu użytkownika podczas wybierania opcji uwierzytelniania dla indywidualnych kont.
Kod Blazor szkieletu Identity szablonu aplikacji internetowej dla bazy danych programu SQL Server. Wersja wiersza polecenia domyślnie używa biblioteki SQLite i zawiera bazę danych SQLite dla programu Identity.
Szablon obsługuje następujące elementy:
- Dodaje IdentityRazor składniki i powiązaną logikę dla rutynowych zadań uwierzytelniania, takich jak logowanie użytkowników i ich out.
- Składniki Identity obsługują również zaawansowane Identity funkcje, takie jak potwierdzenie konta i odzyskiwanie hasła oraz uwierzytelnianie wieloskładnikowe przy użyciu aplikacji innej firmy.
- Obsługiwane są scenariusze interaktywnego renderowania po stronie serwera (interactive SSR) i renderowania po stronie klienta (CSR).
- IdentityDodaje powiązane pakiety i zależności.
- Odwołuje się do Identity pakietów w pliku
_Imports.razor
. - Tworzy niestandardową klasę użytkownika Identity (
ApplicationUser
). - Tworzy i rejestruje EF Core kontekst bazy danych (
ApplicationDbContext
). - Konfiguruje routing dla wbudowanych Identity punktów końcowych.
- Obejmuje Identity walidację i logikę biznesową.
Aby sprawdzić Blazor składniki platformyIdentity, uzyskaj dostęp do nich w Pages
folderachAccount
i Shared
w szablonie Blazor projektu aplikacji internetowej (źródle odwołania).
Po wybraniu trybów renderowania Interactive WebAssembly lub Interactive Auto serwer obsługuje wszystkie żądania uwierzytelniania i autoryzacji, a Identity składniki są renderowane statycznie na serwerze w Blazor głównym projekcie aplikacji internetowej.
Platforma udostępnia niestandardowe AuthenticationStateProvider zarówno w projektach serwera, jak i klienta (.Client
) w celu przepływu stanu uwierzytelniania użytkownika do przeglądarki. Projekt serwera wywołuje metodę AddAuthenticationStateSerialization
, podczas gdy projekt klienta wywołuje metodę AddAuthenticationStateDeserialization
. Uwierzytelnianie na serwerze, a nie na kliencie, umożliwia aplikacji dostęp do stanu uwierzytelniania podczas prerenderingu i przed Blazor WebAssembly zainicjowanie środowiska uruchomieniowego. Implementacje niestandardowe AuthenticationStateProvider używają usługi stanu trwałego składnika (PersistentComponentState) do serializacji stanu uwierzytelniania w komentarzach HTML, a następnie odczytują go z powrotem z zestawu WebAssembly w celu utworzenia nowego AuthenticationState wystąpienia. Aby uzyskać więcej informacji, zobacz sekcję Zarządzanie stanem uwierzytelniania w Blazor usłudze Web Apps .
Tylko w przypadku rozwiązań interactive Server (źródło referencyjne) jest po stronie AuthenticationStateProvider serwera, IdentityRevalidatingAuthenticationStateProvider
która rewalyduje sygnaturę zabezpieczeń dla połączonego użytkownika co 30 minut połączony obwód interaktywny.
Po wybraniu trybów renderowania Interactive WebAssembly lub Interactive Auto serwer obsługuje wszystkie żądania uwierzytelniania i autoryzacji, a Identity składniki są renderowane statycznie na serwerze w Blazor głównym projekcie aplikacji internetowej. Szablon projektu zawiera klasę PersistentAuthenticationStateProvider
(źródło odwołania) w .Client
projekcie w celu zsynchronizowania stanu uwierzytelniania użytkownika między serwerem a przeglądarką. Klasa jest niestandardową implementacją klasy AuthenticationStateProvider. Dostawca używa usługi stanu trwałego składnika () doPersistentComponentState wstępnego podsuwania stanu uwierzytelniania i utrwalania go na stronie.
W głównym projekcie Blazor aplikacji internetowej dostawca stanu uwierzytelniania nosi nazwęIdentityRevalidatingAuthenticationStateProvider
(źródło referencyjne) (tylko rozwiązania interakcyjne serwera) lub PersistingRevalidatingAuthenticationStateProvider
(źródło referencyjne) (WebAssembly lub Auto interactivity solutions).
BlazorIdentity zależy DbContext od wystąpień, które nie są tworzone przez fabrykę, co jest zamierzone, ponieważ DbContext jest wystarczające, aby składniki szablonu Identity projektu były renderowane statycznie bez obsługi interakcyjności.
Aby zapoznać się z opisem sposobu stosowania globalnych trybów renderowania interakcyjnego do składników innychIdentity niż składniki, a jednocześnie wymuszania statycznego przewodnika SSR dla Identity składników, zobacz ASP.NET Tryby renderowania PodstawoweBlazor.
Aby uzyskać więcej informacji na temat utrwalania stanu wstępnego, zobacz Prerender ASP.NET Core components (Składniki prerender ASP.NET CoreRazor).
Aby uzyskać więcej informacji na temat interfejsu BlazorIdentity użytkownika i wskazówek dotyczących integrowania identyfikatorów logowania zewnętrznego za pośrednictwem witryn społecznościowych, zobacz Co nowego z tożsamością na platformie .NET 8.
Uwaga
Linki dokumentacji do źródła referencyjnego platformy .NET zwykle ładują domyślną gałąź repozytorium, która odzwierciedla bieżące programowanie dla następnej wersji platformy .NET. Aby wybrać tag dla określonej wersji, użyj listy rozwijanej Przełącz gałęzie lub tagi. Aby uzyskać więcej informacji, zobacz Jak wybrać tag wersji kodu źródłowego platformy ASP.NET Core (dotnet/AspNetCore.Docs #26205).
Zarządzanie stanem uwierzytelniania w usłudze Blazor Web Apps
Ta sekcja dotyczy Blazor aplikacji internetowych, które przyjmują:
- Indywidualne konta
- Renderowanie po stronie klienta (CSR, interakcyjność oparta na zestawie WebAssembly).
Dostawca stanu uwierzytelniania po stronie klienta jest używany tylko w ramach Blazor programu i nie jest zintegrowany z systemem uwierzytelniania ASP.NET Core. Podczas prerenderingu Blazor uwzględnia metadane zdefiniowane na stronie i używa systemu uwierzytelniania ASP.NET Core w celu określenia, czy użytkownik jest uwierzytelniony. Gdy użytkownik przechodzi z jednej strony do innej, jest używany dostawca uwierzytelniania po stronie klienta. Gdy użytkownik odświeży stronę (załaduj ponownie pełną stronę), dostawca stanu uwierzytelniania po stronie klienta nie jest zaangażowany w decyzję uwierzytelniania na serwerze. Ponieważ stan użytkownika nie jest utrwalany przez serwer, każdy stan uwierzytelniania utrzymywany po stronie klienta zostanie utracony.
Aby rozwiązać ten problem, najlepszym rozwiązaniem jest przeprowadzenie uwierzytelniania w systemie uwierzytelniania ASP.NET Core. Dostawca stanu uwierzytelniania po stronie klienta zajmuje się tylko odzwierciedleniem stanu uwierzytelniania użytkownika. Przykłady tego, jak to zrobić za pomocą dostawców stanu uwierzytelniania, są przedstawiane przez Blazor szablon projektu aplikacji internetowej i opisane poniżej.
W pliku projektu Program
serwera wywołaj metodę AddAuthenticationStateSerialization
, która serializuje AuthenticationState zwrócone przez serwer po stronie AuthenticationStateProvider serwera przy użyciu usługi stan składnika trwałego (PersistentComponentState):
builder.Services.AddRazorComponents()
.AddInteractiveWebAssemblyComponents()
.AddAuthenticationStateSerialization();
Domyślnie interfejs API serializuje tylko nazwę po stronie serwera i oświadczenia roli w celu uzyskania dostępu w przeglądarce. Aby uwzględnić wszystkie oświadczenia, ustaw wartość SerializeAllClaims
na true
w wywołaniu po stronie serwera na wartość AddAuthenticationStateSerialization
:
builder.Services.AddRazorComponents()
.AddInteractiveWebAssemblyComponents()
.AddAuthenticationStateSerialization(
options => options.SerializeAllClaims = true);
W pliku projektu klienta (.Client
) wywołaj metodę AddAuthenticationStateDeserialization
, która dodaje lokalizację AuthenticationStateProvider AuthenticationState deserializacji z serwera przy użyciu i AuthenticationStateData
trwałej usługi stanu składnika (PersistentComponentState).Program
W projekcie serwera powinno istnieć AddAuthenticationStateSerialization
odpowiednie wywołanie.
builder.Services.AddAuthorizationCore();
builder.Services.AddCascadingAuthenticationState();
builder.Services.AddAuthenticationStateDeserialization();
PersistingRevalidatingAuthenticationStateProvider
(źródło referencyjne): w przypadku Blazor aplikacji internetowych, które przyjmują interaktywne renderowanie po stronie serwera (interakcyjne SSR) i renderowanie po stronie klienta (CSR). Jest to strona AuthenticationStateProvider serwera, która rewalyzuje sygnaturę zabezpieczeń dla połączonego użytkownika co 30 minut połączony obwód interakcyjny. Używa ona również usługi Stanu składnika trwałego do przepływu stanu uwierzytelniania do klienta, który jest następnie stały przez okres istnienia żądania CSR.PersistingServerAuthenticationStateProvider
(źródło referencyjne): w przypadku Blazor usługi Web Apps, które przyjmują tylko csr. Jest to strona AuthenticationStateProvider serwera, która używa usługi stanu składnika trwałego do przepływu stanu uwierzytelniania do klienta, który jest następnie stały przez okres istnienia csr.PersistentAuthenticationStateProvider
(źródło referencyjne): w przypadku Blazor aplikacji internetowych, które przyjmują csr. Jest to po stronie AuthenticationStateProvider klienta, która określa stan uwierzytelniania użytkownika, wyszukując dane utrwalone na stronie podczas renderowania na serwerze. Ten stan uwierzytelniania jest stały dla okresu istnienia csr. Jeśli użytkownik musi się zalogować lub wylogować, wymagane jest ponowne załadowanie pełnej strony. Zapewnia to tylko nazwę użytkownika i adres e-mail do celów wyświetlania. Nie obejmuje tokenów uwierzytelniających się na serwerze podczas podejmowania kolejnych żądań, które są obsługiwane oddzielnie przy użyciu elementu cookie uwzględnionego wHttpClient
żądaniach do serwera.
Uwaga
Linki dokumentacji do źródła referencyjnego platformy .NET zwykle ładują domyślną gałąź repozytorium, która odzwierciedla bieżące programowanie dla następnej wersji platformy .NET. Aby wybrać tag dla określonej wersji, użyj listy rozwijanej Przełącz gałęzie lub tagi. Aby uzyskać więcej informacji, zobacz Jak wybrać tag wersji kodu źródłowego platformy ASP.NET Core (dotnet/AspNetCore.Docs #26205).
Szkielet Identity
Aby uzyskać więcej informacji na temat tworzenia Identity szkieletów w aplikacji po stronie Blazor serwera, zobacz Tworzenie szkieletu Identity w projektach ASP.NET Core.
Identity Tworzenie szkieletu w aplikacji po stronie Blazor serwera:
Dodatkowe oświadczenia i tokeny od dostawców zewnętrznych
Aby przechowywać dodatkowe oświadczenia od dostawców zewnętrznych, zobacz Utrwalanie dodatkowych oświadczeń i tokenów od dostawców zewnętrznych na platformie ASP.NET Core.
Usługa Azure App Service dla systemu Linux z serwerem Identity
Podczas wdrażania w usłudze Azure App Service dla systemu Linux z serwerem Identity jawnie określ wystawcę. Aby uzyskać więcej informacji, zobacz Zabezpieczanie Identity zaplecza internetowego interfejsu API dla spAs.
Implementowanie niestandardowego dostawcy AuthenticationStateProvider
Jeśli aplikacja wymaga niestandardowego dostawcy, zaimplementuj AuthenticationStateProvider i przesłoń GetAuthenticationStateAsyncpolecenie .
W poniższym przykładzie wszyscy użytkownicy są uwierzytelniani przy użyciu nazwy użytkownika mrfibuli
.
CustomAuthStateProvider.cs
:
using System.Security.Claims;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Components.Authorization;
public class CustomAuthStateProvider : AuthenticationStateProvider
{
public override Task<AuthenticationState> GetAuthenticationStateAsync()
{
var identity = new ClaimsIdentity(new[]
{
new Claim(ClaimTypes.Name, "mrfibuli"),
}, "Custom Authentication");
var user = new ClaimsPrincipal(identity);
return Task.FromResult(new AuthenticationState(user));
}
}
Usługa jest zarejestrowana CustomAuthStateProvider
Program
w pliku:
using Microsoft.AspNetCore.Components.Authorization;
...
builder.Services.AddScoped<AuthenticationStateProvider, CustomAuthStateProvider>();
Usługa jest zarejestrowana CustomAuthStateProvider
w Program
pliku po wywołaniu metody AddServerSideBlazor:
using Microsoft.AspNetCore.Components.Authorization;
...
builder.Services.AddServerSideBlazor();
...
builder.Services.AddScoped<AuthenticationStateProvider, CustomAuthStateProvider>();
Usługa CustomAuthStateProvider
jest zarejestrowana w Startup.ConfigureServices
usłudze Startup.cs
po wywołaniu metody :AddServerSideBlazor
using Microsoft.AspNetCore.Components.Authorization;
...
services.AddServerSideBlazor();
...
services.AddScoped<AuthenticationStateProvider, CustomAuthStateProvider>();
Potwierdź lub dodaj element AuthorizeRouteView do Router składnika.
W składniku Routes
(Components/Routes.razor
):
<Router ...>
<Found ...>
<AuthorizeRouteView RouteData="routeData"
DefaultLayout="typeof(Layout.MainLayout)" />
...
</Found>
</Router>
Dodaj kaskadowe usługi stanu uwierzytelniania do kolekcji usług w Program
pliku :
builder.Services.AddCascadingAuthenticationState();
Uwaga
Podczas tworzenia Blazor aplikacji na podstawie jednego Blazor z szablonów projektów z włączonym uwierzytelnianiem aplikacja zawiera AuthorizeRouteView wywołanie i .AddCascadingAuthenticationState Aby uzyskać więcej informacji, zobacz ASP.NET Core authentication and authorization with additional information (Uwierzytelnianie i autoryzacja rdzeniaBlazor) z dodatkowymi informacjami przedstawionymi w sekcji Dostosowywanie nieautoryzowanej zawartości za pomocą składnika Router.
Potwierdź lub dodaj element AuthorizeRouteView i CascadingAuthenticationState do Router składnika:
<CascadingAuthenticationState>
<Router ...>
<Found ...>
<AuthorizeRouteView RouteData="routeData"
DefaultLayout="typeof(MainLayout)" />
...
</Found>
</Router>
</CascadingAuthenticationState>
Uwaga
Podczas tworzenia Blazor aplikacji na podstawie jednego Blazor z szablonów projektów z włączonym uwierzytelnianiem aplikacja zawiera AuthorizeRouteView składniki i CascadingAuthenticationState pokazane w poprzednim przykładzie. Aby uzyskać więcej informacji, zobacz ASP.NET Core authentication and authorization with additional information (Uwierzytelnianie i autoryzacja rdzeniaBlazor) z dodatkowymi informacjami przedstawionymi w sekcji Dostosowywanie nieautoryzowanej zawartości za pomocą składnika Router.
Element AuthorizeView demonstruje nazwę uwierzytelnionego użytkownika w dowolnym składniku:
<AuthorizeView>
<Authorized>
<p>Hello, @context.User.Identity?.Name!</p>
</Authorized>
<NotAuthorized>
<p>You're not authorized.</p>
</NotAuthorized>
</AuthorizeView>
Aby uzyskać wskazówki dotyczące korzystania z programu AuthorizeView, zobacz ASP.NET Core authentication and authorization (Uwierzytelnianie i autoryzacja podstawowe ASP.NET CoreBlazor).
Powiadomienie o zmianach stanu uwierzytelniania
W klasie bazowej można wywołać metodę niestandardową AuthenticationStateProvider AuthenticationStateProvider
, aby powiadomić użytkowników o zmianie stanu uwierzytelniania na rerender.NotifyAuthenticationStateChanged
Poniższy przykład jest oparty na implementacji niestandardowej AuthenticationStateProvider , postępując zgodnie ze wskazówkami w sekcji Implementowanie niestandardowego AuthenticationStateProvider
.
Poniższa CustomAuthStateProvider
implementacja uwidacznia niestandardową metodę , AuthenticateUser
w celu zalogowania użytkownika i powiadamiania użytkowników o zmianie stanu uwierzytelniania.
CustomAuthStateProvider.cs
:
using System.Security.Claims;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Components.Authorization;
public class CustomAuthStateProvider : AuthenticationStateProvider
{
public override Task<AuthenticationState> GetAuthenticationStateAsync()
{
var identity = new ClaimsIdentity();
var user = new ClaimsPrincipal(identity);
return Task.FromResult(new AuthenticationState(user));
}
public void AuthenticateUser(string userIdentifier)
{
var identity = new ClaimsIdentity(new[]
{
new Claim(ClaimTypes.Name, userIdentifier),
}, "Custom Authentication");
var user = new ClaimsPrincipal(identity);
NotifyAuthenticationStateChanged(
Task.FromResult(new AuthenticationState(user)));
}
}
W składniku:
- Wstrzykiwanie AuthenticationStateProvider.
- Dodaj pole do przechowywania identyfikatora użytkownika.
- Dodaj przycisk i metodę, aby rzutować AuthenticationStateProvider element na
CustomAuthStateProvider
element i wywołaćAuthenticateUser
element za pomocą identyfikatora użytkownika.
@inject AuthenticationStateProvider AuthenticationStateProvider
<input @bind="userIdentifier" />
<button @onclick="SignIn">Sign in</button>
<AuthorizeView>
<Authorized>
<p>Hello, @context.User.Identity?.Name!</p>
</Authorized>
<NotAuthorized>
<p>You're not authorized.</p>
</NotAuthorized>
</AuthorizeView>
@code {
public string userIdentifier = string.Empty;
private void SignIn()
{
((CustomAuthStateProvider)AuthenticationStateProvider)
.AuthenticateUser(userIdentifier);
}
}
@inject AuthenticationStateProvider AuthenticationStateProvider
<input @bind="userIdentifier" />
<button @onclick="SignIn">Sign in</button>
<AuthorizeView>
<Authorized>
<p>Hello, @context.User.Identity?.Name!</p>
</Authorized>
<NotAuthorized>
<p>You're not authorized.</p>
</NotAuthorized>
</AuthorizeView>
@code {
public string userIdentifier = string.Empty;
private void SignIn()
{
((CustomAuthStateProvider)AuthenticationStateProvider)
.AuthenticateUser(userIdentifier);
}
}
Powyższe podejście można ulepszyć w celu wyzwolenia powiadomień o zmianach stanu uwierzytelniania za pośrednictwem usługi niestandardowej. Poniższa CustomAuthenticationService
klasa obsługuje podmiot zabezpieczeń oświadczeń bieżącego użytkownika w polu zaplecza (currentUser
) ze zdarzeniem (UserChanged
), które AuthenticationStateProvider może subskrybować, gdzie zdarzenie wywołuje NotifyAuthenticationStateChangedelement . W dalszej części tej sekcji CustomAuthenticationService
można wstawić dodatkową konfigurację do składnika z logiką ustawiającą CurrentUser
element w celu wyzwolenia UserChanged
zdarzenia.
using System.Security.Claims;
public class CustomAuthenticationService
{
public event Action<ClaimsPrincipal>? UserChanged;
private ClaimsPrincipal? currentUser;
public ClaimsPrincipal CurrentUser
{
get { return currentUser ?? new(); }
set
{
currentUser = value;
if (UserChanged is not null)
{
UserChanged(currentUser);
}
}
}
}
Program
W pliku zarejestruj CustomAuthenticationService
element w kontenerze wstrzykiwania zależności:
builder.Services.AddScoped<CustomAuthenticationService>();
W Startup.ConfigureServices
pliku Startup.cs
zarejestruj element CustomAuthenticationService
w kontenerze wstrzykiwania zależności:
services.AddScoped<CustomAuthenticationService>();
Poniżej CustomAuthStateProvider
subskrybuje CustomAuthenticationService.UserChanged
zdarzenie. GetAuthenticationStateAsync
zwraca stan uwierzytelniania użytkownika. Początkowo stan uwierzytelniania jest oparty na wartości CustomAuthenticationService.CurrentUser
. Po zmianie użytkownika zostanie utworzony nowy stan uwierzytelniania przy użyciu nowego użytkownika (new AuthenticationState(newUser)
) dla wywołań metody GetAuthenticationStateAsync
:
using System.Security.Claims;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Components.Authorization;
public class CustomAuthStateProvider : AuthenticationStateProvider
{
private AuthenticationState authenticationState;
public CustomAuthStateProvider(CustomAuthenticationService service)
{
authenticationState = new AuthenticationState(service.CurrentUser);
service.UserChanged += (newUser) =>
{
authenticationState = new AuthenticationState(newUser);
NotifyAuthenticationStateChanged(Task.FromResult(authenticationState));
};
}
public override Task<AuthenticationState> GetAuthenticationStateAsync() =>
Task.FromResult(authenticationState);
}
Metoda następującego składnika SignIn
tworzy podmiot zabezpieczeń oświadczeń dla identyfikatora użytkownika, który ma być ustawiony na :CustomAuthenticationService.CurrentUser
@inject CustomAuthenticationService AuthService
<input @bind="userIdentifier" />
<button @onclick="SignIn">Sign in</button>
<AuthorizeView>
<Authorized>
<p>Hello, @context.User.Identity?.Name!</p>
</Authorized>
<NotAuthorized>
<p>You're not authorized.</p>
</NotAuthorized>
</AuthorizeView>
@code {
public string userIdentifier = string.Empty;
private void SignIn()
{
var currentUser = AuthService.CurrentUser;
var identity = new ClaimsIdentity(
new[]
{
new Claim(ClaimTypes.Name, userIdentifier),
},
"Custom Authentication");
var newUser = new ClaimsPrincipal(identity);
AuthService.CurrentUser = newUser;
}
}
@inject CustomAuthenticationService AuthService
<input @bind="userIdentifier" />
<button @onclick="SignIn">Sign in</button>
<AuthorizeView>
<Authorized>
<p>Hello, @context.User.Identity?.Name!</p>
</Authorized>
<NotAuthorized>
<p>You're not authorized.</p>
</NotAuthorized>
</AuthorizeView>
@code {
public string userIdentifier = string.Empty;
private void SignIn()
{
var currentUser = AuthService.CurrentUser;
var identity = new ClaimsIdentity(
new[]
{
new Claim(ClaimTypes.Name, userIdentifier),
},
"Custom Authentication");
var newUser = new ClaimsPrincipal(identity);
AuthService.CurrentUser = newUser;
}
}
Wstrzykiwanie AuthenticationStateProvider
dla usług o zakresie do składnika
Nie próbuj rozwiązywać problemów AuthenticationStateProvider w zakresie niestandardowym, ponieważ powoduje utworzenie nowego wystąpienia obiektu AuthenticationStateProvider , które nie zostało poprawnie zainicjowane.
Aby uzyskać dostęp do AuthenticationStateProvider elementu w ramach usługi o zakresie składnika, należy wstrzyknąć AuthenticationStateProvider element z @inject
dyrektywą lub [Inject]
atrybutem i przekazać go do usługi jako parametr. Takie podejście gwarantuje, że poprawne, zainicjowane wystąpienie AuthenticationStateProvider obiektu jest używane dla każdego wystąpienia aplikacji użytkownika.
ExampleService.cs
:
public class ExampleService
{
public async Task<string> ExampleMethod(AuthenticationStateProvider authStateProvider)
{
var authState = await authStateProvider.GetAuthenticationStateAsync();
var user = authState.User;
if (user.Identity is not null && user.Identity.IsAuthenticated)
{
return $"{user.Identity.Name} is authenticated.";
}
else
{
return "The user is NOT authenticated.";
}
}
}
Zarejestruj usługę jako zakres. W aplikacji po stronie Blazor serwera zakres usług ma okres istnienia równy czasowi trwania obwodu połączenia klienta.
W pliku Program
:
builder.Services.AddScoped<ExampleService>();
W Startup.ConfigureServices
pliku :Startup.cs
services.AddScoped<ExampleService>();
W poniższym składniku InjectAuthStateProvider
:
- Składnik dziedziczy element OwningComponentBase.
- Element AuthenticationStateProvider jest wstrzykiwany i przekazywany do .
ExampleService.ExampleMethod
ExampleService
jest rozpoznawany za pomocą OwningComponentBase.ScopedServices funkcji i GetRequiredService, która zwraca poprawne, zainicjowane wystąpienieExampleService
, które istnieje przez okres istnienia obwodu użytkownika.
InjectAuthStateProvider.razor
:
@page "/inject-auth-state-provider"
@inherits OwningComponentBase
@inject AuthenticationStateProvider AuthenticationStateProvider
<h1>Inject <code>AuthenticationStateProvider</code> Example</h1>
<p>@message</p>
@code {
private string? message;
private ExampleService? ExampleService { get; set; }
protected override async Task OnInitializedAsync()
{
ExampleService = ScopedServices.GetRequiredService<ExampleService>();
message = await ExampleService.ExampleMethod(AuthenticationStateProvider);
}
}
@page "/inject-auth-state-provider"
@inject AuthenticationStateProvider AuthenticationStateProvider
@inherits OwningComponentBase
<h1>Inject <code>AuthenticationStateProvider</code> Example</h1>
<p>@message</p>
@code {
private string? message;
private ExampleService? ExampleService { get; set; }
protected override async Task OnInitializedAsync()
{
ExampleService = ScopedServices.GetRequiredService<ExampleService>();
message = await ExampleService.ExampleMethod(AuthenticationStateProvider);
}
}
Aby uzyskać więcej informacji, zobacz wskazówki dotyczące OwningComponentBase iniekcji zależności ASP.NET CoreBlazor.
Wyświetlanie nieautoryzowanej zawartości podczas prerenderingu za pomocą niestandardowego AuthenticationStateProvider
Aby uniknąć wyświetlania nieautoryzowanej zawartości, na przykład zawartości w składnikuAuthorizeView
, podczas prerendering z niestandardowym AuthenticationStateProvider
elementem , należy zastosować jedną z następujących metod:
Zaimplementuj IHostEnvironmentAuthenticationStateProvider obsługę prerenderingu niestandardowegoAuthenticationStateProvider: aby zapoznać się z przykładową implementacją IHostEnvironmentAuthenticationStateProviderprogramu , zobacz Blazor implementację ServerAuthenticationStateProvider platformy w
ServerAuthenticationStateProvider.cs
(źródle referencyjnym).Uwaga
Linki dokumentacji do źródła referencyjnego platformy .NET zwykle ładują domyślną gałąź repozytorium, która odzwierciedla bieżące programowanie dla następnej wersji platformy .NET. Aby wybrać tag dla określonej wersji, użyj listy rozwijanej Przełącz gałęzie lub tagi. Aby uzyskać więcej informacji, zobacz Jak wybrać tag wersji kodu źródłowego platformy ASP.NET Core (dotnet/AspNetCore.Docs #26205).
Wyłącz prerendering: wskazuje tryb renderowania z parametrem
prerender
ustawionym nafalse
najwyższy poziom składnika w hierarchii składników aplikacji, który nie jest składnikiem głównym.Uwaga
Tworzenie składnika głównego interakcyjnego, takiego jak
App
składnik, nie jest obsługiwane. W związku z tym prerendering nie może być wyłączony bezpośrednio przezApp
składnik.W przypadku aplikacji opartych na szablonie Blazor projektu aplikacja internetowa wstępne jest zwykle wyłączone, gdy
Routes
składnik jest używany w składnikuApp
(Components/App.razor
) :<Routes @rendermode="new InteractiveServerRenderMode(prerender: false)" />
Ponadto wyłącz prerendering dla
HeadOutlet
składnika:<HeadOutlet @rendermode="new InteractiveServerRenderMode(prerender: false)" />
Można również selektywnie sterować trybem renderowania zastosowanym
Routes
do wystąpienia składnika. Zobacz na przykład tryby renderowania ASP.NET CoreBlazor.
- Uwierzytelnij użytkownika na serwerze przed rozpoczęciem działania aplikacji: aby zastosować to podejście, aplikacja musi odpowiadać na początkowe żądanie użytkownika przy użyciu strony logowania lub wyświetlania opartego Identityna protokole i uniemożliwić uwierzytelnianie żądań do Blazor punktów końcowych. Aby uzyskać więcej informacji, zobacz Tworzenie aplikacji ASP.NET Core z danymi użytkownika chronionymi przez autoryzację. Po uwierzytelnieniu nieautoryzowana zawartość w prerenderowanych Razor składnikach jest wyświetlana tylko wtedy, gdy użytkownik jest naprawdę nieautoryzowany do wyświetlania zawartości.
Zarządzanie stanem użytkownika
Pomimo słowa "state" w nazwie AuthenticationStateProvider nie jest przeznaczony do przechowywania stanu użytkownika ogólnego. AuthenticationStateProvider Wskazuje tylko stan uwierzytelniania użytkownika w aplikacji, niezależnie od tego, czy są oni zalogowani do aplikacji i którzy są zalogowani jako.
Uwierzytelnianie używa tego samego uwierzytelniania ASP.NET Core Identity co Razor aplikacje Pages i MVC. Stan użytkownika przechowywany dla przepływów ASP.NET Core Identity do Blazor bez dodawania dodatkowego kodu do aplikacji. Postępuj zgodnie ze wskazówkami w artykułach ASP.NET Core Identity i samouczkach dotyczących Identity funkcji, które zostaną zastosowane w Blazor częściach aplikacji.
Aby uzyskać wskazówki dotyczące ogólnego zarządzania stanem poza programem ASP.NET CoreIdentity, zobacz zarządzanie stanem ASP.NET CoreBlazor.
Dodatkowe abstrakcje zabezpieczeń
Dwie dodatkowe abstrakcje uczestniczą w zarządzaniu stanem uwierzytelniania:
ServerAuthenticationStateProvider(źródło referencyjne): Element AuthenticationStateProviderużywany przez platformę Blazor do uzyskiwania stanu uwierzytelniania z serwera.
RevalidatingServerAuthenticationStateProvider (źródło referencyjne): klasa bazowa usług AuthenticationStateProvider używanych przez Blazor platformę do odbierania stanu uwierzytelniania ze środowiska hosta i ich ponownego aktualizowania w regularnych odstępach czasu.
Domyślny interwał 30-minutowej zmiany można dostosować w (
RevalidatingIdentityAuthenticationStateProvider
Areas/Identity/RevalidatingIdentityAuthenticationStateProvider.cs
). Poniższy przykład skraca interwał do 20 minut:protected override TimeSpan RevalidationInterval => TimeSpan.FromMinutes(20);
Uwaga
Linki dokumentacji do źródła referencyjnego platformy .NET zwykle ładują domyślną gałąź repozytorium, która odzwierciedla bieżące programowanie dla następnej wersji platformy .NET. Aby wybrać tag dla określonej wersji, użyj listy rozwijanej Przełącz gałęzie lub tagi. Aby uzyskać więcej informacji, zobacz Jak wybrać tag wersji kodu źródłowego platformy ASP.NET Core (dotnet/AspNetCore.Docs #26205).
Zarządzanie stanem uwierzytelniania przy wylogowywaniu
Po stronie Blazor serwera stan uwierzytelniania użytkownika jest utrwalany przez cały okres istnienia obwodu, w tym na kartach przeglądarki. Aby aktywnie oznaczać użytkownika na kartach przeglądarki, gdy użytkownik wyloguje się na jednej karcie, musisz zaimplementować RevalidatingServerAuthenticationStateProvider (źródło referencyjne) z krótkim RevalidationInterval.
Uwaga
Linki dokumentacji do źródła referencyjnego platformy .NET zwykle ładują domyślną gałąź repozytorium, która odzwierciedla bieżące programowanie dla następnej wersji platformy .NET. Aby wybrać tag dla określonej wersji, użyj listy rozwijanej Przełącz gałęzie lub tagi. Aby uzyskać więcej informacji, zobacz Jak wybrać tag wersji kodu źródłowego platformy ASP.NET Core (dotnet/AspNetCore.Docs #26205).
Czas trwania ważności tymczasowego adresu URL przekierowania
Ta sekcja dotyczy Blazor usługi Web Apps.
RazorComponentsServiceOptions.TemporaryRedirectionUrlValidityDuration Użyj opcji , aby uzyskać lub ustawić okres ważności ochrony danych dla tymczasowych adresów URL przekierowania emitowanych przez Blazor renderowanie po stronie serwera. Są one używane tylko w sposób przejściowy, więc okres istnienia musi być wystarczająco długi, aby klient odbierał adres URL i rozpoczynał nawigację do niego. Jednak powinno to być również wystarczająco długie, aby umożliwić niesymetryczność zegara na serwerach. Wartość domyślna to pięć minut.
W poniższym przykładzie wartość jest rozszerzona do siedmiu minut:
builder.Services.AddRazorComponents(options =>
options.TemporaryRedirectionUrlValidityDuration =
TimeSpan.FromMinutes(7));
Dodatkowe zasoby
- Szybki start: dodawanie logowania przy użyciu konta Microsoft do aplikacji internetowej platformy ASP.NET Core
- Szybki start: ochrona internetowego interfejsu API ASP.NET Core przy użyciu platformy tożsamości Microsoft
- Konfigurowanie ASP.NET Core do pracy z serwerami proxy i modułami równoważenia obciążenia: zawiera wskazówki dotyczące:
- Używanie oprogramowania pośredniczącego nagłówków przekazywanych w celu zachowania informacji o schemacie HTTPS między serwerami proxy i sieciami wewnętrznymi.
- Dodatkowe scenariusze i przypadki użycia, w tym ręczna konfiguracja schematu, żądanie zmiany ścieżki żądania na potrzeby prawidłowego routingu żądań i przekazywanie schematu żądań dla zwrotnych serwerów proxy systemu Linux i innych niż IIS.