Delen via


ASP.NET Core Blazor WebAssembly beveiligen met ASP.NET Core Identity

Notitie

Dit is niet de nieuwste versie van dit artikel. Zie de .NET 9-versie van dit artikelvoor de huidige release.

Belangrijk

Deze informatie heeft betrekking op een pre-releaseproduct dat aanzienlijk kan worden gewijzigd voordat het commercieel wordt uitgebracht. Microsoft geeft geen garanties, uitdrukkelijk of impliciet, met betrekking tot de informatie die hier wordt verstrekt.

Zie de .NET 9-versie van dit artikelvoor de huidige release.

Zelfstandige Blazor WebAssembly-apps kunnen worden beveiligd met ASP.NET Core Identity door de richtlijnen in dit artikel te volgen.

Eindpunten voor het registreren, aanmelden en afmelden

In plaats van de standaard gebruikersinterface te gebruiken die wordt geleverd door ASP.NET Core Identity voor SPA- en Blazor-apps, die is gebaseerd op Razor Pagina's, roept u MapIdentityApi aan in een back-end-API om JSON-API-eindpunten toe te voegen voor het registreren en inloggen van gebruikers met ASP.NET Core Identity. Identity API-eindpunten bieden ook ondersteuning voor geavanceerde functies, zoals tweeledige verificatie en e-mailverificatie.

Roep op de client het /register-eindpunt aan om een gebruiker te registreren met zijn e-mailadres en wachtwoord:

var result = await _httpClient.PostAsJsonAsync(
    "register", new
    {
        email,
        password
    });

Log in als gebruiker op de client met cookie-authenticatie via de /login-endpoint en stel de useCookies-queryreeks in op true:

var result = await _httpClient.PostAsJsonAsync(
    "login?useCookies=true", new
    {
        email,
        password
    });

De Backendserver-API brengt cookie-verificatie tot stand met een aanroep van AddIdentityCookies op de authenticatie-bouwer:

builder.Services
    .AddAuthentication(IdentityConstants.ApplicationScheme)
    .AddIdentityCookies();

Tokenverificatie

Voor systeemeigen en mobiele scenario's waarbij sommige clients geen cookies ondersteunen, biedt de aanmeldings-API een parameter voor het aanvragen van tokens.

Waarschuwing

We raden u aan cookies te gebruiken voor browser-apps in plaats van tokens, omdat de browser cookies verwerkt zonder ze bloot te stellen aan JavaScript. Als u ervoor kiest om beveiliging op basis van tokens in web-apps te gebruiken, bent u verantwoordelijk voor het beveiligen van de tokens.

Er wordt een aangepast token (een token dat eigendom is van het ASP.NET Core Identity-platform) uitgegeven dat kan worden gebruikt om volgende aanvragen te verifiëren. Het token moet als een "bearer token" worden doorgegeven in de Authorization-header. Er wordt ook een ververstoken opgegeven. Met dit token kan de app een nieuw token aanvragen wanneer het oude token verloopt zonder dat de gebruiker zich opnieuw hoeft aan te melden.

De tokens zijn geen standaard JSON-webtokens (JWT's). Het gebruik van aangepaste tokens is opzettelijk, omdat de ingebouwde Identity-API voornamelijk bedoeld is voor eenvoudige scenario's. De tokenoptie is niet bedoeld als een volledig uitgeruste identity serviceprovider of tokenserver, maar in plaats daarvan als een alternatief voor de cookie optie voor cliënten die geen cookies kunnen gebruiken.

De volgende richtlijnen beginnen met het implementeren van verificatie op basis van tokens met de aanmeldings-API. Aangepaste code is vereist om de implementatie te voltooien. Voor meer informatie zie . Gebruik Identity om een web-API-back-end voor SPA'ste beveiligen.

In plaats van dat de back-endserver-API cookie-authenticatie tot stand brengt met een aanroep naar AddIdentityCookies op de authenticatiebouwer, stelt de server-API bearer-token-verificatie in met de AddBearerToken-extensiemethode. Geef het schema op voor bearer-verificatietokens met IdentityConstants.BearerScheme.

Wijzig in Backend/Program.csde verificatieservices en configuratie in het volgende:

builder.Services
    .AddAuthentication()
    .AddBearerToken(IdentityConstants.BearerScheme);

Verwijder in BlazorWasmAuth/Identity/CookieAuthenticationStateProvider.csde queryparameter useCookies in de methode LoginAsync van de CookieAuthenticationStateProvider:

- login?useCookies=true
+ login

Op dit moment moet u aangepaste code opgeven om de AccessTokenResponse op de client te parseren en de toegangs- en vernieuwingstokens te beheren. Voor meer informatie zie . Gebruik Identity om een web-API-back-end voor SPA'ste beveiligen.

Aanvullende Identity-scenario's

Scenario's die worden behandeld in de documentatieset van Blazor:

Voor informatie over aanvullende Identity-scenario's die door de API worden geleverd, zie Identity gebruiken om een web-API-backend voor SPA's te beveiligen.

  • Geselecteerde eindpunten beveiligen
  • Beheer van gebruikersgegevens

Gebruik veilige authenticatiestromen om gevoelige gegevens en inloggegevens te beschermen

Waarschuwing

Sla geen app-geheimen, verbindingsreeksen, referenties, wachtwoorden, persoonlijke identificatienummers (PINCODE's), persoonlijke C#/.NET-code of persoonlijke sleutels/tokens op in code aan de clientzijde. Dit is altijd onveilig. In test-/staging- en productieomgevingen moeten server-side Blazor code en web-API's beveiligde verificatiestromen gebruiken om te voorkomen dat referenties in projectcode of configuratiebestanden worden opgeslagen. Buiten het testen van lokale ontwikkeling raden we u aan het gebruik van omgevingsvariabelen voor het opslaan van gevoelige gegevens te vermijden, omdat omgevingsvariabelen niet de veiligste benadering zijn. Voor het testen van lokale ontwikkeling wordt het hulpprogramma Secret Manager aanbevolen voor het beveiligen van gevoelige gegevens. Zie Gevoelige gegevens en referenties veilig onderhoudenvoor meer informatie.

Voorbeeld-apps

In dit artikel dienen voorbeeld-apps als referentie voor zelfstandige Blazor WebAssembly-apps die toegang hebben tot ASP.NET Core Identity via een back-endweb-API. De demonstratie bevat twee apps:

  • Backend: een back-end-web-API-app die een gebruiker identity store onderhoudt voor ASP.NET Core-Identity.
  • BlazorWasmAuth: een zelfstandige Blazor WebAssembly front-end-app met gebruikersverificatie.

Open de voorbeeld-apps via de meest recente versiemap vanuit de hoofdmap van de opslagplaats met de volgende koppeling. De voorbeelden zijn beschikbaar voor .NET 8 of hoger. Zie het bestand README in de map BlazorWebAssemblyStandaloneWithIdentity voor stappen voor het uitvoeren van de voorbeeld-apps.

Bekijk of download de voorbeeldcode (hoe te downloaden)

App-pakketten en code voor back-end-web-API

De web-API-app voor de backend onderhoudt een gebruikersopslag identity voor ASP.NET Core Identity.

Pakketten

De app maakt gebruik van de volgende NuGet-pakketten:

Als uw app een andere EF Core databaseprovider gebruikt dan de in-memory provider, maakt u geen pakketverwijzing in uw app voor Microsoft.EntityFrameworkCore.InMemory.

In het projectbestand (.csproj) van de app wordt invariante globalisering geconfigureerd.

Voorbeeld-app-code

app-instellingen back-end- en front-end-URL's configureren:

  • Backend app (BackendUrl): https://localhost:7211
  • BlazorWasmAuth app (FrontendUrl): https://localhost:7171

Het Backend.http-bestand kan worden gebruikt voor het testen van de aanvraag voor weergegevens. Houd er rekening mee dat de BlazorWasmAuth-app moet worden uitgevoerd om het eindpunt te testen en dat het eindpunt in het bestand is vastgelegd. Zie HTTP-bestanden gebruiken in Visual Studio 2022voor meer informatie.

De volgende installatie en configuratie vindt u in het Program-bestand van de app.

Gebruikers identity met cookie verificatie worden toegevoegd door AddAuthentication en AddIdentityCookiesaan te roepen. Services voor autorisatiecontroles worden toegevoegd door een aanroep naar AddAuthorizationBuilder.

Alleen aanbevolen voor demonstraties, gebruikt de app de EF Core in-memory databaseprovider voor de databasecontextregistratie (AddDbContext). De in-memory databaseprovider maakt het eenvoudig om de app opnieuw op te starten en de registratie- en aanmeldingsgebruikersstromen te testen. Elke uitvoering begint met een nieuwe database, maar de app bevat demonstratiecode voor het invoegen van testgebruikers, die verderop in dit artikel wordt beschreven. Als de database wordt omgezet naar SQLite, worden gebruikers opgeslagen tussen sessies, maar moet de database worden gemaakt via migraties, zoals getoond in de EF Core inleidende handleiding†. U kunt andere relationele providers, zoals SQL Server, gebruiken voor uw productiecode.

Notitie

De EF Core-handleiding voor beginners maakt gebruik van PowerShell-opdrachten om databasemigraties uit te voeren bij het gebruik van Visual Studio. Een alternatieve benadering in Visual Studio is het gebruik van de gebruikersinterface van Connected Services:

Dubbelklik in Solution Explorerop Connected Services. Selecteer in Serviceafhankelijkheden>SQL Server Express LocalDBhet beletselteken (...), gevolgd door Migratie toevoegen om een migratie te maken of Database bijwerken om de database bij te werken.

Configureer Identity om de EF Core-database te gebruiken en de Identity-eindpunten beschikbaar te maken via de aanroepen naar AddIdentityCore, AddEntityFrameworkStoresen AddApiEndpoints.

Er wordt een CORS-beleid (Cross-Origin Resource Sharing) ingesteld om aanvragen van de front-end- en back-end-apps toe te staan. Terugval-URL's worden geconfigureerd voor het CORS-beleid als app-instellingen deze niet opgeven:

  • Backend app (BackendUrl): https://localhost:5001
  • BlazorWasmAuth app (FrontendUrl): https://localhost:5002

Services en eindpunten voor Swagger/OpenAPI- zijn opgenomen voor web-API-documentatie en ontwikkelingstests. Zie Aan de slag met NSwag en ASP.NET Corevoor meer informatie over NSwag.

Claims voor gebruikersrollen worden verzonden vanaf een minimale API- op het /roles-eindpunt.

Routes worden toegewezen aan de eindpunten van Identity doordat MapIdentityApi<AppUser>()wordt aangeroepen.

Een afmeldingseindpunt (/Logout) is geconfigureerd in de middleware-pijplijn om gebruikers af te melden.

Als u een eindpunt wilt beveiligen, voegt u de RequireAuthorization-extensiemethode toe aan de routedefinitie. Voor een controller voegt u het kenmerk [Authorize] toe aan de controller of actie.

Voor meer informatie over basispatronen voor initialisatie en configuratie van een DbContext exemplaar, zie DbContext Lifetime, Configuration en Initialization in de documentatie van EF Core.

Zelfstandige front-end-Blazor WebAssembly-app-pakketten en -code

Een zelfstandige Blazor WebAssembly front-end-app demonstreert gebruikersverificatie en -autorisatie voor toegang tot een privéwebpagina.

Pakketten

De app maakt gebruik van de volgende NuGet-pakketten:

Voorbeeld-app-code

De map Models bevat de modellen van de app:

De IAccountManagement interface (Identity/CookieHandler.cs) biedt accountbeheerservices.

De CookieAuthenticationStateProvider klasse (Identity/CookieAuthenticationStateProvider.cs) beheert de status voor verificatie op basis van cookieen biedt de service-implementaties voor accountbeheer zoals beschreven door de IAccountManagement-interface. De methode LoginAsync maakt cookie authenticatie expliciet mogelijk via de waarde van de useCookies queryreeks van true. De klasse beheert ook het maken van rolclaims voor geverifieerde gebruikers.

De CookieHandler-klasse (Identity/CookieHandler.cs) zorgt ervoor dat cookie referenties worden verzonden met elke aanvraag naar de back-endweb-API, die Identity verwerkt en het Identity gegevensarchief onderhoudt.

De wwwroot/appsettings.file biedt back-end- en front-end-URL-eindpunten.

Het App-onderdeel de verificatiestatus beschikbaar maakt als trapsgewijze parameter. Zie ASP.NET Core Blazor verificatie- en autorisatie-voor meer informatie.

Het MainLayout-onderdeel en NavMenu onderdeel het AuthorizeView-onderdeel gebruiken om selectief inhoud weer te geven op basis van de verificatiestatus van de gebruiker.

De volgende onderdelen verwerken algemene taken voor gebruikersverificatie, die gebruikmaken van IAccountManagement-services:

Voor het PrivatePage-onderdeel (Components/Pages/PrivatePage.razor) is verificatie vereist en worden de claims van de gebruiker weergegeven.

Services en configuratie worden geleverd in het Program-bestand (Program.cs):

  • De cookie handler wordt geregistreerd als een service met beperkte scope.
  • Autorisatieservices zijn geregistreerd.
  • De aangepaste verificatiestatusprovider wordt geregistreerd als een 'scoped service'.
  • De interface voor accountbeheer (IAccountManagement) is geregistreerd.
  • De basis-URL van de host is geconfigureerd voor een geregistreerd HTTP-clientexemplaar.
  • De basis-back-end-URL is geconfigureerd voor een geregistreerd HTTP-clientexemplaar dat wordt gebruikt voor authenticatie-interacties met de back-end-web-API. De HTTP-client gebruikt de cookie handler om ervoor te zorgen dat cookie referenties bij elke aanvraag worden verzonden.

Roep AuthenticationStateProvider.NotifyAuthenticationStateChanged aan wanneer de verificatiestatus van de gebruiker verandert. Zie bijvoorbeeld de LoginAsync- en LogoutAsync methoden van de CookieAuthenticationStateProvider klasse (Identity/CookieAuthenticationStateProvider.cs).

Waarschuwing

Het AuthorizeView-onderdeel geeft selectief UI-inhoud weer, afhankelijk van of de gebruiker is geautoriseerd. Alle inhoud binnen een Blazor WebAssembly-app die in een AuthorizeView-onderdeel wordt geplaatst, kan zonder verificatie worden gedetecteerd, zodat gevoelige inhoud moet worden verkregen van een web-API op basis van een back-endserver nadat de verificatie is geslaagd. Zie de volgende bronnen voor meer informatie:

Demonstratie van seeding van testgebruiker

De SeedData-klasse (SeedData.cs) laat zien hoe u testgebruikers maakt voor ontwikkeling. De testgebruiker met de naam Leela meldt zich aan bij de app met het e-mailadres leela@contoso.com. Het wachtwoord van de gebruiker is ingesteld op Passw0rd!. Leela krijgt Administrator en Manager rollen voor autorisatie, waardoor de gebruiker toegang heeft tot de managerpagina op /private-manager-page, maar niet tot de editorpagina op /private-editor-page.

Waarschuwing

Laat testgebruikerscode nooit uitvoeren in een productieomgeving. SeedData.InitializeAsync wordt alleen aangeroepen in de Development-omgeving in het bestand Program:

if (builder.Environment.IsDevelopment())
{
    await using var scope = app.Services.CreateAsyncScope();
    await SeedData.InitializeAsync(scope.ServiceProvider);
}

Rollen

Rolclaims worden niet teruggestuurd vanaf het manage/info-eindpunt om gebruikersclaims te maken voor gebruikers van de BlazorWasmAuth-app. Rolclaims worden onafhankelijk beheerd via een afzonderlijke aanvraag in de GetAuthenticationStateAsync methode van de CookieAuthenticationStateProvider klasse (Identity/CookieAuthenticationStateProvider.cs) nadat de gebruiker is geverifieerd in het Backend project.

In de CookieAuthenticationStateProviderwordt een aanvraag voor rollen ingediend bij het /roles-eindpunt van het Backend server-API-project. Het antwoord wordt in een tekenreeks gelezen door ReadAsStringAsync()aan te roepen. JsonSerializer.Deserialize deserialiseert de tekenreeks naar een aangepaste RoleClaim array. Ten slotte worden de claims toegevoegd aan de verzameling claims van de gebruiker.

In het Backend-bestand van de Program-server-API beheert een minimale API het /roles-eindpunt. Claims van RoleClaimType worden geselecteerd in een anoniem type en geserialiseerd voor terugkeer naar het BlazorWasmAuth project met TypedResults.Json.

Het eindpunt van de rollen vereist autorisatie door RequireAuthorizationaan te roepen. Als u besluit Minimal API's niet te gebruiken ten gunste van controllers voor beveiligde server-API-eindpunten, moet u het [Authorize] kenmerk op controllers of acties toewijzen.

Hosting tussen domeinen (configuratie van dezelfde site)

De voorbeeld-apps zijn geconfigureerd voor het hosten van beide apps in hetzelfde domein. Als u de Backend-app host op een ander domein dan de BlazorWasmAuth-app, haalt u het commentaar weg bij de code waarmee de cookie (ConfigureApplicationCookie) in het Backend-bestand van de Program-app wordt geconfigureerd. De standaardwaarden zijn:

Wijzig de waarden in:

- options.Cookie.SameSite = SameSiteMode.Lax;
- options.Cookie.SecurePolicy = CookieSecurePolicy.SameAsRequest;
+ options.Cookie.SameSite = SameSiteMode.None;
+ options.Cookie.SecurePolicy = CookieSecurePolicy.Always;

Voor meer informatie over de instellingen voor same-site cookie, zie de volgende bronnen:

Ondersteuning voor antivervalsing

Alleen het afmeldingseindpunt (/logout) in de Backend-app vereist aandacht om de dreiging van CSRF-(Cross-Site Request Forgery) te beperken.

Het afmeldingseindpunt controleert op een lege hoofdtekst om CSRF-aanvallen te voorkomen. Door een hoofdtekst te vereisen, moet de aanvraag worden gedaan vanuit JavaScript. Dit is de enige manier om toegang te krijgen tot de verificatie cookie. Het afmeldingseindpunt kan niet worden geopend via een op formulieren gebaseerde POST. Hiermee voorkomt u dat een kwaadwillende site de gebruiker afmeldt.

Bovendien wordt het eindpunt beveiligd door autorisatie (RequireAuthorization) om anonieme toegang te voorkomen.

De BlazorWasmAuth clientapp hoeft alleen maar een leeg object {} door te geven in het aanvraagbericht.

Buiten het afmeldingseindpunt is antivervalsingsbeperking alleen vereist wanneer formuliergegevens worden verzonden naar de server die is gecodeerd als application/x-www-form-urlencoded, multipart/form-dataof text/plain. Blazor beheert CSRF-beperking voor formulieren in de meeste gevallen. Zie ASP.NET Core Blazor authentication and authorization and ASP.NET Core Blazor forms overviewvoor meer informatie.

Voor aanvragen voor andere server-API-eindpunten (web-API) met application/jsongecodeerde inhoud en CORS- is geen CSRF-beveiliging vereist. Daarom is er geen CSRF-beveiliging vereist voor het Backend-eindpunt voor gegevensverwerking (/data-processing). Het eindpunt (/roles) heeft geen CSRF-beveiliging nodig omdat het een GET-eindpunt is dat geen status wijzigt.

Problemen oplossen

Loggen

Zie Blazorom debuggen of traceerlogregistratie in te schakelen voor -verificatie.

Veelvoorkomende fouten

Controleer de configuratie van elk project. Controleer of de URL's juist zijn:

  • Backend project
    • appsettings.json
      • BackendUrl
      • FrontendUrl
    • Backend.http: Backend_HostAddress
  • BlazorWasmAuth project: wwwroot/appsettings.json
    • BackendUrl
    • FrontendUrl

Als de configuratie correct wordt weergegeven:

  • Toepassingslogboeken analyseren.

  • Bekijk het netwerkverkeer tussen de BlazorWasmAuth app en Backend app met de ontwikkelhulpprogramma's van de browser. Vaak wordt een exacte foutmelding of een bericht met een aanwijzing over wat het probleem veroorzaakt, aan de klant geretourneerd door de backend-app nadat u een aanvraag hebt ingediend. Richtlijnen voor ontwikkelhulpprogramma's vindt u in de volgende artikelen:

  • Google Chrome (Google-documentatie)

  • Microsoft Edge

  • Mozilla Firefox (Mozilla-documentatie)

Het documentatieteam reageert op het documentfeedback en fouten in artikelen. Open een probleem met behulp van de Open een documentatieprobleem koppeling onderaan het artikel. Het team kan geen productondersteuning bieden. Er zijn verschillende openbare ondersteuningsforums beschikbaar om u te helpen bij het oplossen van problemen met een app. U wordt aangeraden het volgende te doen:

De voorgaande forums zijn niet eigendom van of worden beheerd door Microsoft.

Voor foutrapporten over niet-beveiliging, niet-gevoelige en niet-vertrouwelijke reproduceerbare frameworks, een probleem openen met de ASP.NET Core-producteenheid. Meld geen probleem bij het productteam totdat u de oorzaak van een probleem grondig hebt onderzocht en het niet zelf of met behulp van de community op een openbaar ondersteuningsforum kunt oplossen. De producteenheid kan geen problemen met afzonderlijke apps oplossen die zijn verbroken vanwege eenvoudige onjuiste configuratie of gebruiksscenario's met betrekking tot services van derden. Als een rapport gevoelig of vertrouwelijk van aard is of een mogelijke beveiligingsfout in het product beschrijft die cyberaanvallers kunnen misbruiken, raadpleegt u Beveiligingsproblemen en bugs (dotnet/aspnetcore GitHub-opslagplaats) melden.

Cookies en sitegegevens

Cookies en sitegegevens kunnen worden bewaard in app-updates en kunnen het testen en oplossen van problemen verstoren. Wis het volgende wanneer u app-codewijzigingen, wijzigingen in gebruikersaccounts of app-configuratiewijzigingen aanbrengt:

  • Aanmeldingscookies van gebruikers
  • App-cookies
  • Sitegegevens in cache en opgeslagen

Een benadering om te voorkomen dat achterblijvende cookies en sitegegevens het testen en oplossen van problemen verstoren, is het volgende:

  • Een browser configureren
    • Gebruik een browser om te testen dat u kunt configureren om alle cookie en sitegegevens te verwijderen telkens wanneer de browser wordt gesloten.
    • Zorg ervoor dat de browser handmatig of door de IDE is gesloten voor een wijziging in de configuratie van de app, testgebruiker of provider.
  • Gebruik een aangepaste opdracht om een browser te openen in de InPrivate- of Incognitomodus in Visual Studio:
    • Open dialoogvenster Bladeren met vanuit de knop Uitvoeren van Visual Studio.
    • Selecteer de knop Toevoegen.
    • Geef het pad naar uw browser op in het veld Program. De volgende uitvoerbare paden zijn typische installatielocaties voor Windows 10. Als uw browser is geïnstalleerd op een andere locatie of als u Windows 10 niet gebruikt, geeft u het pad op naar het uitvoerbare bestand van de browser.
      • Microsoft Edge: C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe
      • Google Chrome: C:\Program Files (x86)\Google\Chrome\Application\chrome.exe
      • Mozilla Firefox: C:\Program Files\Mozilla Firefox\firefox.exe
    • Geef in het veld Argumenten de opdrachtregeloptie op die de browser gebruikt om in de InPrivate- of Incognitomodus te openen. Voor sommige browsers is de URL van de app vereist.
      • Microsoft Edge: gebruik -inprivate.
      • Google Chrome: gebruik --incognito --new-window {URL}, waarbij de {URL} tijdelijke aanduiding de URL is die moet worden geopend (bijvoorbeeld https://localhost:5001).
      • Mozilla Firefox: gebruik -private -url {URL}, waarbij de tijdelijke aanduiding {URL} de URL is die geopend moet worden (bijvoorbeeld https://localhost:5001).
    • Geef een naam op in het veld Vriendelijke naam. Bijvoorbeeld Firefox Auth Testing.
    • Selecteer de knop OK.
    • Om te voorkomen dat u het browserprofiel moet selecteren voor elke iteratie van het testen met een app, stelt u het profiel in als de standaardinstelling met de knop Als standaard instellen.
    • Zorg ervoor dat de browser wordt gesloten door de IDE voor elke wijziging in de app, testgebruiker of providerconfiguratie.

App-upgrades

Een werkende app kan onmiddellijk mislukken na het upgraden van de .NET Core SDK op de ontwikkelcomputer of het wijzigen van pakketversies in de app. In sommige gevallen kunnen incoherent pakketten een app breken bij het uitvoeren van belangrijke upgrades. De meeste van deze problemen kunnen worden opgelost door de volgende instructies te volgen:

  1. Wis de NuGet-pakketcaches van het lokale systeem door dotnet nuget locals all --clear uit te voeren vanuit een opdrachtshell.
  2. Verwijder de bin en obj mappen van het project.
  3. Herstel het project en bouw het opnieuw.
  4. Verwijder alle bestanden in de implementatiemap op de server voordat u de app opnieuw implementeert.

Notitie

Het gebruik van pakketversies die niet compatibel zijn met het doelframework van de app, wordt niet ondersteund. Gebruik de NuGet Gallery of FuGet Package Explorervoor informatie over een pakket.

De claims van de gebruiker controleren

Als u problemen met gebruikersclaims wilt oplossen, kan het volgende UserClaims onderdeel rechtstreeks in apps worden gebruikt of dienen als basis voor verdere aanpassing.

UserClaims.razor:

@page "/user-claims"
@using System.Security.Claims
@attribute [Authorize]

<PageTitle>User Claims</PageTitle>

<h1>User Claims</h1>

**Name**: @AuthenticatedUser?.Identity?.Name

<h2>Claims</h2>

@foreach (var claim in AuthenticatedUser?.Claims ?? Array.Empty<Claim>())
{
    <p class="claim">@(claim.Type): @claim.Value</p>
}

@code {
    [CascadingParameter]
    private Task<AuthenticationState>? AuthenticationState { get; set; }

    public ClaimsPrincipal? AuthenticatedUser { get; set; }

    protected override async Task OnInitializedAsync()
    {
        if (AuthenticationState is not null)
        {
            var state = await AuthenticationState;
            AuthenticatedUser = state.User;
        }
    }
}

Aanvullende informatiebronnen