Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Opmerking
Dit is niet de nieuwste versie van dit artikel. Zie de .NET 10-versie van dit artikel voor de huidige release.
Waarschuwing
Deze versie van ASP.NET Core wordt niet meer ondersteund. Zie het .NET- en .NET Core-ondersteuningsbeleid voor meer informatie. Zie de .NET 9-versie van dit artikel voor de huidige release.
In dit artikel wordt uitgelegd hoe u een aangepaste verificatiestatusprovider maakt en meldingen ontvangt over wijzigingsmeldingen van gebruikersverificatiestatussen in code.
De algemene benaderingen voor apps aan de serverzijde en clientzijde Blazor zijn vergelijkbaar, maar verschillen in hun exacte implementaties, dus dit artikel draait tussen apps aan de serverzijde Blazor en apps aan de clientzijde Blazor . Gebruik de draaikiezer boven aan het artikel om de draaitabel van het artikel te wijzigen zodat deze overeenkomt met het type Blazor project waarmee u werkt:
- Apps aan de serverzijde Blazor (Server pivot): Blazor Server voor .NET 7 of eerder en het serverproject van een Blazor Web App vanaf .NET 8 of hoger.
- Apps aan de clientzijde Blazor (pivot): Blazor WebAssembly voor alle versies van .NET of het Blazor WebAssembly project van een
.Client.NETBlazor Web App 8 of hoger.
Abstracte AuthenticationStateProvider klasse
Het Blazor framework bevat een abstracte AuthenticationStateProvider klasse voor informatie over de verificatiestatus van de huidige gebruiker met de volgende leden:
- GetAuthenticationStateAsync: Haalt asynchroon de authenticatiestatus van de huidige gebruiker op.
- AuthenticationStateChanged: Een gebeurtenis die een melding geeft wanneer de verificatiestatus is gewijzigd. Deze gebeurtenis kan bijvoorbeeld worden gegenereerd als een gebruiker zich aanmeldt of afmeldt bij de app.
- NotifyAuthenticationStateChanged: hiermee wordt een wijziging van de verificatiestatus gegenereerd.
Implementeer een aangepaste AuthenticationStateProvider
De app moet verwijzen naar het Microsoft.AspNetCore.Components.Authorization NuGet-pakket, dat ondersteuning biedt voor verificatie en autorisatie voor Blazor apps.
Opmerking
Zie voor richtlijnen over het toevoegen van pakketten aan .NET-apps de artikelen onder Pakketten installeren en beheren in de Package consumption workflow (NuGet-documentatie). Bevestig de juiste pakketversies op NuGet.org.
Configureer de volgende verificatie-, autorisatie- en trapsgewijze verificatiestatusservices in het Program bestand.
Wanneer u een Blazor app maakt op basis van een van de Blazor projectsjablonen waarvoor verificatie is ingeschakeld, wordt de app vooraf geconfigureerd met de volgende serviceregistraties, waaronder het weergeven van de verificatiestatus als een trapsgewijze parameter. Zie ASP.NET Core-verificatie Blazor en -autorisatie voor meer gedetailleerde informatie in de sectie Aanpassen van niet-geautoriseerde inhoud met de Router-component van het artikel.
using Microsoft.AspNetCore.Components.Authorization;
...
builder.Services.AddAuthorization();
builder.Services.AddCascadingAuthenticationState();
Configureer verificatie- en autorisatieservices in het Program bestand.
Wanneer u een Blazor app maakt op basis van een van de Blazor projectsjablonen waarvoor verificatie is ingeschakeld, bevat de app de volgende serviceregistratie.
using Microsoft.AspNetCore.Components.Authorization;
...
builder.Services.AddAuthorization();
Configureer verificatie- en autorisatieservices in Startup.ConfigureServices van Startup.cs.
Wanneer u een Blazor app maakt op basis van een van de Blazor projectsjablonen waarvoor verificatie is ingeschakeld, bevat de app de volgende serviceregistratie.
using Microsoft.AspNetCore.Components.Authorization;
...
services.AddAuthorization();
Configureer in Blazor WebAssembly apps (alle .NET-versies) of het .Client project van een Blazor Web App (.NET 8 of hoger) de services voor authenticatie, autorisatie en trapsgewijze verificatiestatus in het Program bestand.
Wanneer u een Blazor app maakt op basis van een van de Blazor projectsjablonen waarvoor verificatie is ingeschakeld, wordt de app vooraf geconfigureerd met de volgende serviceregistraties, waaronder het weergeven van de verificatiestatus als een trapsgewijze parameter. Zie ASP.NET Core-verificatie Blazor en -autorisatie voor meer gedetailleerde informatie in de sectie Aanpassen van niet-geautoriseerde inhoud met de Router-component van het artikel.
using Microsoft.AspNetCore.Components.Authorization;
...
builder.Services.AddAuthorizationCore();
builder.Services.AddCascadingAuthenticationState();
Configureer verificatie- en autorisatieservices in het Program bestand.
Wanneer u een Blazor app maakt op basis van een van de Blazor projectsjablonen waarvoor verificatie is ingeschakeld, bevat de app de volgende serviceregistratie.
using Microsoft.AspNetCore.Components.Authorization;
...
builder.Services.AddAuthorizationCore();
Subklasse AuthenticationStateProvider en overschrijf GetAuthenticationStateAsync om de verificatiestatus van de gebruiker te creëren. In het volgende voorbeeld worden alle gebruikers geverifieerd met de gebruikersnaam mrfibuli.
CustomAuthStateProvider.cs:
using System.Security.Claims;
using Microsoft.AspNetCore.Components.Authorization;
public class CustomAuthStateProvider : AuthenticationStateProvider
{
public override Task<AuthenticationState> GetAuthenticationStateAsync()
{
var identity = new ClaimsIdentity(
[
new Claim(ClaimTypes.Name, "mrfibuli"),
], "Custom Authentication");
var user = new ClaimsPrincipal(identity);
return Task.FromResult(new AuthenticationState(user));
}
}
Opmerking
De voorgaande code waarmee een nieuwe ClaimsIdentity wordt gemaakt, maakt gebruik van vereenvoudigde initialisatie van verzamelingen die is geïntroduceerd met C# 12 (.NET 8). Zie Verzamelingsexpressies - C#-taalverwijzing voor meer informatie.
De CustomAuthStateProvider service is geregistreerd in het Program bestand. Registreer de service binnen het bereik van AddScoped:
builder.Services.AddScoped<AuthenticationStateProvider, CustomAuthStateProvider>();
Registreer in een Blazor Server app de service scoped met AddScopedna de aanroep naar AddServerSideBlazor:
builder.Services.AddServerSideBlazor();
builder.Services.AddScoped<AuthenticationStateProvider, CustomAuthStateProvider>();
Registreer in een Blazor Server app de service scoped met AddScopedna de aanroep naar AddServerSideBlazor:
services.AddServerSideBlazor();
services.AddScoped<AuthenticationStateProvider, CustomAuthStateProvider>();
De CustomAuthStateProvider service is geregistreerd in het Program bestand. Registreer de service singleton bij AddSingleton:
builder.Services.AddSingleton<AuthenticationStateProvider, CustomAuthStateProvider>();
Als deze niet aanwezig is, voegt u een @using instructie toe aan het _Imports.razor bestand om de Microsoft.AspNetCore.Components.Authorization naamruimte beschikbaar te maken voor alle onderdelen:
@using Microsoft.AspNetCore.Components.Authorization;
Bevestig of wijzig het routeweergavecomponent naar een AuthorizeRouteView in de componentdefinitie Router. De locatie van het Router onderdeel verschilt, afhankelijk van het type app. Gebruik de zoekfunctie om het onderdeel te vinden als u zich niet bewust bent van de locatie in het project.
<Router ...>
<Found ...>
<AuthorizeRouteView RouteData="routeData"
DefaultLayout="typeof(Layout.MainLayout)" />
...
</Found>
</Router>
Opmerking
Wanneer u een Blazor app maakt op basis van een van de Blazor projectsjablonen waarvoor verificatie is ingeschakeld, bevat de app het AuthorizeRouteView onderdeel. Zie ASP.NET Core-verificatie Blazor en -autorisatie voor meer gedetailleerde informatie in de sectie Aanpassen van niet-geautoriseerde inhoud met de Router-component van het artikel.
Waar het Router onderdeel zich bevindt:
- Bevestig of wijzig het onderdeel van de routeweergave in een AuthorizeRouteView.
- Bevestig of voeg een CascadingAuthenticationState onderdeel toe rond het Router onderdeel.
De locatie van het Router onderdeel verschilt, afhankelijk van het type app. Gebruik de zoekfunctie om het onderdeel te vinden als u zich niet bewust bent van de locatie in het project.
<CascadingAuthenticationState>
<Router ...>
<Found ...>
<AuthorizeRouteView RouteData="routeData"
DefaultLayout="typeof(MainLayout)" />
...
</Found>
</Router>
</CascadingAuthenticationState>
Opmerking
Wanneer u een Blazor app maakt op basis van een van de Blazor projectsjablonen waarvoor verificatie is ingeschakeld, bevat de app de AuthorizeRouteView en CascadingAuthenticationState onderdelen. Zie ASP.NET Core-verificatie Blazor en -autorisatie voor meer gedetailleerde informatie in de sectie Aanpassen van niet-geautoriseerde inhoud met de Router-component van het artikel.
In het volgende voorbeeldonderdeel AuthorizeView ziet u de naam van de geverifieerde gebruiker:
<AuthorizeView>
<Authorized>
<p>Hello, @context.User.Identity?.Name!</p>
</Authorized>
<NotAuthorized>
<p>You're not authorized.</p>
</NotAuthorized>
</AuthorizeView>
Zie AuthorizeView voor hulp bij het gebruik vanBlazor.
Meldingen over wijziging van verificatiestatus
Een aangepast AuthenticationStateProvider element kan NotifyAuthenticationStateChanged aanroepen op de AuthenticationStateProvider basisklasse om consumenten te informeren over de wijziging van de authenticatiestatus voor her-rendering.
Het volgende voorbeeld is gebaseerd op het implementeren van een aangepaste AuthenticationStateProvider versie door de richtlijnen te volgen in de sectie Een aangepaste AuthenticationStateProvider sectie implementeren eerder in dit artikel. Als u de richtlijnen in die sectie al hebt gevolgd, vervangt het volgende CustomAuthStateProvider de richtlijnen die in de sectie worden weergegeven.
In de volgende CustomAuthStateProvider implementatie wordt een aangepaste methode weergegeven om AuthenticateUsereen gebruiker aan te melden en consumenten op de hoogte te stellen van de wijziging van de verificatiestatus.
CustomAuthStateProvider.cs:
using System.Security.Claims;
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 Claim(ClaimTypes.Name, userIdentifier),
], "Custom Authentication");
var user = new ClaimsPrincipal(identity);
NotifyAuthenticationStateChanged(
Task.FromResult(new AuthenticationState(user)));
}
}
Opmerking
De voorgaande code waarmee een nieuwe ClaimsIdentity wordt gemaakt, maakt gebruik van vereenvoudigde initialisatie van verzamelingen die is geïntroduceerd met C# 12 (.NET 8). Zie Verzamelingsexpressies - C#-taalverwijzing voor meer informatie.
In een onderdeel:
- Injecteren AuthenticationStateProvider.
- Voeg een veld toe om de id van de gebruiker vast te houden.
- Voeg een knop en een methode toe om AuthenticationStateProvider te casten naar
CustomAuthStateProviderenAuthenticateUseraan te roepen met de gebruikers-ID.
@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);
}
}
De voorgaande benadering kan worden uitgebreid om meldingen van wijzigingen in de verificatiestatus te activeren via een aangepaste service. De volgende CustomAuthenticationService klasse beheert de claims-principal van de huidige gebruiker in een achterliggend veld (currentUser) met een gebeurtenis (UserChanged) waarop de authenticatiestatusprovider zich kan abonneren, waarbij de gebeurtenis NotifyAuthenticationStateChanged aanroept. Met de aanvullende configuratie verderop in deze sectie kan de CustomAuthenticationService component worden geïnjecteerd in een onderdeel met logica waarmee de CurrentUserUserChanged gebeurtenis wordt geactiveerd.
CustomAuthenticationService.cs:
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);
}
}
}
}
Registreer in het Program bestand de CustomAuthenticationService container voor afhankelijkheidsinjectie:
builder.Services.AddScoped<CustomAuthenticationService>();
Startup.ConfigureServices
Startup.cs Registreer in de CustomAuthenticationService container voor afhankelijkheidsinjectie:
services.AddScoped<CustomAuthenticationService>();
Registreer in het Program bestand de CustomAuthenticationService container voor afhankelijkheidsinjectie:
builder.Services.AddSingleton<CustomAuthenticationService>();
Het volgende CustomAuthStateProvider registreert zich voor het CustomAuthenticationService.UserChanged evenement. De GetAuthenticationStateAsync methode retourneert de verificatiestatus van de gebruiker. In eerste instantie is de verificatiestatus gebaseerd op de waarde van de CustomAuthenticationService.CurrentUser. Wanneer de gebruiker wordt gewijzigd, wordt er een nieuwe verificatiestatus gemaakt voor de nieuwe gebruiker (new AuthenticationState(newUser)) voor aanroepen naar GetAuthenticationStateAsync:
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);
}
De methode van het volgende component SignIn maakt een claims-principal aan voor de identifier van de gebruiker die moet worden ingesteld op CustomAuthenticationService.CurrentUser.
@using System.Security.Claims
@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 Claim(ClaimTypes.Name, userIdentifier),
],
"Custom Authentication");
var newUser = new ClaimsPrincipal(identity);
AuthService.CurrentUser = newUser;
}
}
Opmerking
De voorgaande code waarmee een nieuwe ClaimsIdentity wordt gemaakt, maakt gebruik van vereenvoudigde initialisatie van verzamelingen die is geïntroduceerd met C# 12 (.NET 8). Zie Verzamelingsexpressies - C#-taalverwijzing voor meer informatie.
Aanvullende bronnen
-
Niet-geautoriseerde inhoud aan de serverside wordt getoond tijdens het voor-renderen met een aangepaste
AuthenticationStateProvider -
Toegang tot een
AuthenticationStateProvidervanuit eenDelegatingHandlerdie is opgezet met eenIHttpClientFactory - Een ASP.NET Core Blazor Web App beveiligen met OpenID Connect (OIDC)
- ASP.NET Core Blazor WebAssembly beveiligen met ASP.NET Core Identity
-
Niet-geautoriseerde inhoud aan de serverside wordt getoond tijdens het voor-renderen met een aangepaste
AuthenticationStateProvider -
Toegang tot een
AuthenticationStateProvidervanuit eenDelegatingHandlerdie is opgezet met eenIHttpClientFactory - Een ASP.NET Core Blazor Web App beveiligen met OpenID Connect (OIDC)
- Beveilig ASP.NET Core Blazor WebAssembly met ASP.NET Core IdentityPrerendering met authenticatie in gehoste Blazor WebAssembly apps