Udostępnij za pośrednictwem


Zabezpieczanie autonomicznej aplikacji ASP.NET Core Blazor WebAssembly przy użyciu kont Microsoft

Uwaga

Nie jest to najnowsza wersja tego artykułu. Aby zapoznać się z obecną wersją, zobacz wersję tego artykułu platformy .NET 9.

Ostrzeżenie

Ta wersja ASP.NET Core nie jest już obsługiwana. Aby uzyskać więcej informacji, zobacz zasady pomocy technicznej platformy .NET i platformy .NET Core. Aby zapoznać się z bieżącą wersją, zobacz wersję tego artykułu dla .NET 9.

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ą, zobacz w wersji artykułu .NET 9.

W tym artykule wyjaśniono, jak utworzyć autonomiczną Blazor WebAssemblyaplikację, która używa kont Microsoft z usługą Microsoft Entra (ME-ID) do uwierzytelniania.

Aby uzyskać dodatkowe pokrycie scenariuszy zabezpieczeń po przeczytaniu tego artykułu, zobacz dodatkowe scenariusze zabezpieczeń w ASP.NET Core.

Przewodnik

Podsekcje przewodnika wyjaśniają, jak:

  • Tworzenie dzierżawy na platformie Azure
  • Rejestrowanie aplikacji na platformie Azure
  • Utwórz aplikację Blazor
  • Uruchom aplikację

Tworzenie dzierżawy na platformie Azure

Postępuj zgodnie z przewodnikiem Szybki start: Konfigurowanie dzierżawy, aby utworzyć dzierżawę w ME-ID.

Rejestrowanie aplikacji na platformie Azure

Zarejestruj aplikację ME-ID:

  1. Przejdź do Microsoft Entra ID w portalu Azure. Wybierz Rejestracje aplikacji na pasku bocznym. Wybierz przycisk Nowa rejestracja.
  2. Podaj nazwę aplikacji (na przykład BlazorAutonomiczne konta ME-ID MS).
  3. W obszarze Obsługiwane typy kont wybierz pozycję Konta w dowolnym katalogu organizacyjnym (Dowolny katalog Microsoft Entra ID — multitenant).
  4. Ustaw listę rozwijaną Identyfikator URI przekierowania na aplikację jednostronicową (SPA) i podaj następujący identyfikator URI przekierowania: https://localhost/authentication/login-callback. Jeśli znasz identyfikator URI przekierowania produkcyjnego dla domyślnego hosta platformy Azure (na przykład azurewebsites.net) lub niestandardowego hosta domeny (na przykład contoso.com), możesz również dodać identyfikator URI przekierowania w środowisku produkcyjnym w tym samym czasie, gdy udostępniasz localhost identyfikator URI przekierowania. Pamiętaj, aby uwzględnić numer portu dla portów innych niż :443 w URI przekierowań produkcyjnych, które dodajesz.
  5. Jeśli używasz niezweryfikowanej domeny wydawcy, wyczyść pole wyboru Uprawnienia> oraz Udziel zgody administratora na uprawnienia openid i offline_access. Jeśli domena wydawcy jest zweryfikowana, to pole wyboru nie jest obecne.
  6. Wybierz pozycję Zarejestruj.

Uwaga

Podanie numeru portu dla URI przekierowania ME-ID nie jest wymagane. Aby uzyskać więcej informacji, zobacz Ograniczenia i ograniczenia dotyczące identyfikatora URI przekierowania (adres URL odpowiedzi): Wyjątki hosta lokalnego (dokumentacja entra).

Zarejestruj identyfikator aplikacji (klienta) (na przykład 00001111-aaaa-2222-bbbb-3333cccc4444).

W obszarze Konfiguracje platformy uwierzytelniania>Aplikacja jednostronicowa>:

  1. Upewnij się, że identyfikator URI https://localhost/authentication/login-callback przekierowania jest obecny.
  2. W sekcji Upoważnienie implicit upewnij się, że pola wyboru dla tokenów dostępu i tokenów identyfikatorów nie są zaznaczone. Nie zaleca się używania niejawnego udzielania w aplikacjach Blazor korzystających z MSAL w wersji 2.0 lub nowszej. Aby uzyskać więcej informacji, zobacz Secure ASP.NET Core Blazor WebAssembly.
  3. Pozostałe wartości domyślne aplikacji są akceptowalne dla tego środowiska.
  4. Wybierz przycisk Zapisz, jeśli wprowadzono zmiany.

Utwórz aplikację Blazor

Utwórz aplikację. Zastąp symbole zastępcze w poniższym poleceniu informacjami zarejestrowanymi wcześniej i wykonaj następujące polecenie w powłoce poleceń:

dotnet new blazorwasm -au SingleOrg --client-id "{CLIENT ID}" --tenant-id "common" -o {PROJECT NAME}
Symbol zastępczy Nazwa witryny Azure Portal Przykład
{PROJECT NAME} BlazorSample
{CLIENT ID} Identyfikator aplikacji (klient) 00001111-aaaa-2222-bbbb-3333cccc4444

Lokalizacja wyjściowa określona opcją -o|--output tworzy folder projektu, jeśli nie istnieje, i staje się częścią nazwy projektu.

Dodaj parę MsalProviderOptions dla openid i offline_accessDefaultAccessTokenScopes:

builder.Services.AddMsalAuthentication(options =>
{
    ...
    options.ProviderOptions.DefaultAccessTokenScopes.Add("openid");
    options.ProviderOptions.DefaultAccessTokenScopes.Add("offline_access");
});

Uruchom aplikację

Aby uruchomić aplikację, użyj jednej z następujących metod:

  • Visual Studio
    • Wybierz przycisk Run (Uruchom).
    • Użyj polecenia Debuguj>Rozpocznij debugowanie z menu.
    • Naciśnij klawisz F5.
  • Powłoka wiersza poleceń platformy .NET: wykonaj polecenie dotnet watch (lub dotnet run) z folderu aplikacji.

Części aplikacji

W tej sekcji opisano części aplikacji wygenerowane na Blazor WebAssembly podstawie szablonu projektu i sposób konfigurowania aplikacji. Nie ma konkretnych wskazówek, które należy wykonać w tej sekcji dla podstawowej aplikacji roboczej, jeśli aplikacja została utworzona przy użyciu wskazówek w sekcji Przewodnik . Wskazówki zawarte w tej sekcji są przydatne podczas aktualizowania aplikacji w celu uwierzytelniania i autoryzowania użytkowników. Jednak alternatywnym podejściem do aktualizowania aplikacji jest utworzenie nowej aplikacji na podstawie wskazówek w sekcji Przewodnik i przeniesienie składników, klas i zasobów aplikacji do nowej aplikacji.

Pakiet uwierzytelniania

Po utworzeniu aplikacji do korzystania z kont służbowych lub szkolnych (SingleOrg) aplikacja automatycznie otrzymuje odwołanie do pakietu biblioteki Microsoft Authentication Library (Microsoft.Authentication.WebAssembly.Msal). Pakiet zawiera zestaw elementów pierwotnych, które ułatwiają aplikacji uwierzytelnianie użytkowników i uzyskiwanie tokenów w celu wywoływania chronionych interfejsów API.

W przypadku dodawania uwierzytelniania do aplikacji ręcznie dodaj Microsoft.Authentication.WebAssembly.Msal pakiet do aplikacji.

Uwaga

Aby uzyskać instrukcje dodawania pakietów do aplikacji .NET, zobacz artykuły w sekcji Instalowanie pakietów i zarządzanie nimi w temacie Przepływ pracy użycia pakietów (dokumentacja programu NuGet). Sprawdź prawidłowe wersje pakietów pod adresem NuGet.org.

Pakiet Microsoft.Authentication.WebAssembly.Msal przechodnio dodaje Microsoft.AspNetCore.Components.WebAssembly.Authentication pakiet do aplikacji.

Obsługa usługi uwierzytelniania

Obsługa uwierzytelniania użytkowników jest rejestrowana w kontenerze usługi przy użyciu metody rozszerzenia dostarczonej przez pakiet AddMsalAuthenticationMicrosoft.Authentication.WebAssembly.Msal. Ta metoda konfiguruje wszystkie usługi wymagane przez aplikację do interakcji z dostawcą Identity (IP).

W pliku Program:

builder.Services.AddMsalAuthentication(options =>
{
    builder.Configuration.Bind("AzureAd", options.ProviderOptions.Authentication);
});

Metoda AddMsalAuthentication akceptuje wywołanie zwrotne w celu skonfigurowania parametrów wymaganych do uwierzytelnienia aplikacji. Wartości wymagane do skonfigurowania aplikacji można uzyskać z konfiguracji ME-ID podczas rejestrowania aplikacji.

Konfiguracja wwwroot/appsettings.json

Konfiguracja jest dostarczana przez plik wwwroot/appsettings.json.

{
  "AzureAd": {
    "Authority": "https://login.microsoftonline.com/common",
    "ClientId": "{CLIENT ID}",
    "ValidateAuthority": true
  }
}

Przykład:

{
  "AzureAd": {
    "Authority": "https://login.microsoftonline.com/common",
    "ClientId": "00001111-aaaa-2222-bbbb-3333cccc4444",
    "ValidateAuthority": true
  }
}

Zakresy tokenu dostępu

Szablon Blazor WebAssembly nie konfiguruje automatycznie aplikacji pod kątem żądania tokenu dostępu dla bezpiecznego interfejsu API. Aby aprowizować token dostępu w ramach przepływu logowania, dodaj zakres do domyślnych zakresów tokenu dostępu w obiekcie MsalProviderOptions:

builder.Services.AddMsalAuthentication(options =>
{
    ...
    options.ProviderOptions.DefaultAccessTokenScopes.Add("{SCOPE URI}");
});

Określ dodatkowe zakresy za pomocą polecenia AdditionalScopesToConsent:

options.ProviderOptions.AdditionalScopesToConsent.Add("{ADDITIONAL SCOPE URI}");

Uwaga

AdditionalScopesToConsent w przypadku Microsoft Graph za pośrednictwem interfejsu użytkownika zgody Microsoft Entra ID, gdy użytkownik najpierw używa aplikacji zarejestrowanej na platformie Microsoft Azure. Aby uzyskać więcej informacji, zobacz Use Graph API with ASP.NET Core (Używanie interfejsu API programu Graph z programem ASP.NET Core Blazor WebAssembly).

Aby uzyskać więcej informacji, zobacz następujące sekcje artykułu Dodatkowe scenariusze :

Tryb logowania

Platforma domyślnie wyświetla tryb logowania wyskakującego i wraca do trybu logowania przekierowania, jeśli nie można otworzyć wyskakującego okienka. Skonfiguruj bibliotekę MSAL do korzystania z trybu logowania przekierowania, ustawiając LoginMode właściwość MsalProviderOptions na :redirect

builder.Services.AddMsalAuthentication(options =>
{
    ...
    options.ProviderOptions.LoginMode = "redirect";
});

Ustawieniem domyślnym jest popup, a wartość ciągu nie uwzględnia wielkości liter.

Importuje plik

Microsoft.AspNetCore.Components.Authorization Przestrzeń nazw jest udostępniana w całej _Imports.razor aplikacji za pośrednictwem pliku:

...
@using Microsoft.AspNetCore.Components.Authorization
...

Strona indeksu

Strona Indeks (wwwroot/index.html) zawiera skrypt, który definiuje element AuthenticationService w języku JavaScript. AuthenticationService obsługuje szczegóły niskiego poziomu protokołu OIDC. Aplikacja wewnętrznie wywołuje metody zdefiniowane w skry skryptie w celu wykonania operacji uwierzytelniania.

<script src="_content/Microsoft.Authentication.WebAssembly.Msal/AuthenticationService.js"></script>

Składnik aplikacji

Składnik App (App.razor) jest podobny do składnika App występującego w aplikacjach Blazor Server.

  • Składnik AuthorizeRouteView zapewnia, że bieżący użytkownik ma autoryzację dostępu do danej strony lub w inny sposób renderuje RedirectToLogin składnik.
  • Składnik RedirectToLogin zarządza przekierowywaniem nieautoryzowanych użytkowników do strony logowania.
  • Składnik CascadingAuthenticationState zarządza ujawnianiem AuthenticationState reszcie aplikacji.
  • Składnik AuthorizeRouteView zapewnia, że bieżący użytkownik ma autoryzację dostępu do danej strony lub w inny sposób renderuje RedirectToLogin składnik.
  • Składnik RedirectToLogin zarządza przekierowywaniem nieautoryzowanych użytkowników do strony logowania.

Ze względu na zmiany w ramach w wersjach ASP.NET Core, znaczniki składnika App (App.razor) nie są wyświetlane w tej sekcji. Aby sprawdzić znaczniki składnika dla danej wersji, użyj jednej z następujących metod:

  • Utwórz aplikację aprowizowaną do uwierzytelniania na podstawie domyślnego Blazor WebAssembly szablonu projektu dla wersji ASP.NET Core, która ma być używana. Sprawdź komponent App (App.razor) w wygenerowanej aplikacji.

  • App Sprawdź składnik (App.razor) w źródle referencyjnym. Wybierz wersję z selektora gałęzi i wyszukaj komponent w folderze ProjectTemplates repozytorium, ponieważ przez lata został przeniesiony.

    Uwaga

    Linki dokumentacji do źródła referencyjnego platformy .NET zwykle ładują domyślną gałąź repozytorium, która reprezentuje bieżący etap rozwoju dla następnego wydania .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).

Komponent RedirectToLogin

Składnik RedirectToLogin (RedirectToLogin.razor):

  • Zarządza przekierowywaniem nieautoryzowanych użytkowników do strony logowania.
  • Bieżący adres URL, do którego użytkownik próbuje uzyskać dostęp, jest przechowywany w celu umożliwienia powrotu do tej strony, jeśli uwierzytelnianie zakończy się pomyślnie, przy użyciu:
    • Stan historii nawigacji w programie ASP.NET Core na platformie .NET 7 lub nowszym.
    • Ciąg zapytania w programie ASP.NET Core na platformie .NET 6 lub starszej wersji.

RedirectToLogin Sprawdź składnik w źródle referencyjnym. Lokalizacja składnika zmieniła się wraz z upływem czasu, dlatego użyj narzędzi wyszukiwania GitHub, aby zlokalizować składnik.

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).

Składnik LoginDisplay

Składnik LoginDisplay (LoginDisplay.razor) jest renderowany w składniku MainLayout (MainLayout.razor) i zarządza następującymi zachowaniami:

  • W przypadku uwierzytelnionych użytkowników:
    • Wyświetla bieżącą nazwę użytkownika.
    • Oferuje link do strony profilu użytkownika w programie ASP.NET Core Identity.
    • Oferuje przycisk do wylogowania się z aplikacji.
  • W przypadku użytkowników anonimowych:
    • Oferuje opcję rejestracji.
    • Oferuje opcję logowania.

Ze względu na zmiany w strukturze między wersjami ASP.NET Core, znaczniki dla składnika LoginDisplay nie są wyświetlane w tej sekcji. Aby sprawdzić znaczniki składnika dla danej wersji, użyj jednej z następujących metod:

  • Utwórz aplikację aprowizowaną do uwierzytelniania na podstawie domyślnego Blazor WebAssembly szablonu projektu dla wersji ASP.NET Core, która ma być używana. Sprawdź komponent LoginDisplay w wygenerowanej aplikacji.

  • LoginDisplay Sprawdź składnik w źródle referencyjnym. Lokalizacja składnika zmieniła się wraz z upływem czasu, dlatego użyj narzędzi wyszukiwania GitHub, aby zlokalizować składnik. Użyto szablonowej zawartości dla Hosted równej true.

    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).

Składnik uwierzytelniania

Strona utworzona przez składnik Authentication (Pages/Authentication.razor) definiuje trasy wymagane do obsługi różnych etapów uwierzytelniania.

Składnik RemoteAuthenticatorView :

@page "/authentication/{action}"
@using Microsoft.AspNetCore.Components.WebAssembly.Authentication

<RemoteAuthenticatorView Action="@Action" />

@code {
    [Parameter]
    public string? Action { get; set; }
}

Uwaga

Typy referencyjne dopuszczające wartość null (NRT) i statyczna analiza stanu null kompilatora .NET są obsługiwane w ASP.NET Core na platformie .NET 6 lub nowszej. Przed wydaniem ASP.NET Core w .NET 6 typ string pojawia się bez oznaczenia jako typ null (?).

Rozwiązywanie problemów

Rejestrowanie

Aby włączyć rejestrowanie debugowania lub śledzenia dla Blazor WebAssembly uwierzytelniania, zapoznaj się z sekcją Rejestrowanie uwierzytelniania po stronie klienta w ASP.NET Core Blazor logging, z ustawionym selektorem wersji artykułu na ASP.NET Core 7.0 lub nowszym.

Typowe błędy

  • Błędna konfiguracja aplikacji lub Identity dostawcy (IP)

    Najczęstsze błędy są spowodowane nieprawidłową konfiguracją. Poniżej przedstawiono kilka przykładów:

    • W zależności od wymagań scenariusza brakujący lub niepoprawny autorytet, instancja, identyfikator dzierżawy, domena dzierżawy, identyfikator klienta lub URI przekierowania uniemożliwia aplikacji uwierzytelnianie klientów.
    • Nieprawidłowe zakresy żądań uniemożliwiają klientom uzyskiwanie dostępu do punktów końcowych internetowego interfejsu API serwera.
    • Nieprawidłowe lub brakujące uprawnienia interfejsu API serwera uniemożliwiają klientom uzyskiwanie dostępu do punktów końcowych internetowego interfejsu API serwera.
    • Uruchamianie aplikacji na innym porcie niż skonfigurowany w URI przekierowania podczas rejestracji aplikacji adresu IP. Należy pamiętać, że port nie jest wymagany dla Microsoft Entra ID i aplikacji działającej na adresie testowym w środowisku deweloperskimlocalhost, ale konfiguracja portu aplikacji i port, na którym działa aplikacja, musi być zgodna z adresami innymi niżlocalhost.

    Sekcje konfiguracji tego artykułu zawierają przykłady prawidłowej konfiguracji. Dokładnie sprawdź każdą sekcję artykułu, aby wyszukać błędną konfigurację aplikacji i adresu IP.

    Jeśli konfiguracja jest poprawna:

    • Analizowanie dzienników aplikacji.

    • Sprawdź ruch sieciowy między aplikacją kliencka a adresem IP lub aplikacją serwera przy użyciu narzędzi deweloperskich przeglądarki. Często dokładny komunikat o błędzie lub komunikat zawierający wskazówki dotyczące przyczyn problemu jest zwracany do klienta przez adres IP lub aplikację serwera po wykonaniu żądania. Znajdziesz wskazówki dotyczące narzędzi programistycznych w następujących artykułach:

    • W przypadku wersji Blazor , w których jest używany token internetowy JSON (JWT), zdekoduj zawartość tokenu używanego do uwierzytelniania klienta lub uzyskiwania dostępu do internetowego interfejsu API serwera, w zależności od tego, gdzie występuje problem. Aby uzyskać więcej informacji, zobacz Inspekcja zawartości tokenu internetowego JSON (JWT).

    Zespół dokumentacji odpowiada na opinie dotyczące dokumentów i zgłoszone usterki w artykułach (zgłoś problem z sekcji opinii Ta strona), ale nie może zapewnić wsparcia produktowego. Dostępnych jest kilka publicznych forów pomocy technicznej, które ułatwiają rozwiązywanie problemów z aplikacją. Zalecamy:

    Poprzednie fora nie należą do firmy Microsoft ani nie są kontrolowane przez firmę Microsoft.

    W przypadku raportów usterek dotyczących frameworków niezwiązanych z bezpieczeństwem, które są niewrażliwe i niepoufne, zgłoś problem do zespołu produktu ASP.NET Core. Nie otwieraj problemu z jednostką produktu, dopóki nie zbadasz dokładnie przyczyny problemu i nie możesz go rozwiązać samodzielnie i z pomocą społeczności na publicznym forum pomocy technicznej. Jednostka produktu nie może rozwiązywać problemów z poszczególnymi aplikacjami, które są uszkodzone z powodu prostej błędnej konfiguracji lub przypadków użycia obejmujących usługi innych firm. Jeśli raport jest poufny lub poufny lub opisuje potencjalną lukę w zabezpieczeniach produktu, którą mogą wykorzystać cyberataki, zobacz Raportowanie problemów z zabezpieczeniami i usterek (dotnet/aspnetcorerepozytorium GitHub).

  • Nieautoryzowany klient ME-ID

    info: Autoryzacja Microsoft.AspNetCore.Authorization.DefaultAuthorizationService[2] nie powiodła się. Te wymagania nie zostały spełnione: DenyAnonymousAuthorizationRequirement: Wymaga uwierzytelnionego użytkownika.

    Błąd wywołania zwrotnego logowania z identyfikatora ME-ID:

    • Błąd: unauthorized_client
    • Opis: AADB2C90058: The provided application is not configured to allow public clients.

    Aby naprawić ten błąd:

    1. W witrynie Azure Portal uzyskaj dostęp do manifestu aplikacji.
    2. allowPublicClient Ustaw atrybut na null lub true.

Pliki cookie i dane witryn

Pliki cookie i dane witryn mogą być utrwalane w aktualizacjach aplikacji i zakłócać testowanie i rozwiązywanie problemów. Wyczyść następujące informacje podczas wprowadzania zmian w kodzie aplikacji, zmiany konta użytkownika w dostawcy lub zmiany konfiguracji aplikacji dostawcy:

  • Pliki cookie logowania użytkownika
  • Pliki cookie aplikacji
  • Buforowane i przechowywane dane lokacji

Jednym ze sposobów zapobiegania wpływowi utrzymujących się plików cookie i danych witryny na testowanie i rozwiązywanie problemów jest:

  • Konfigurowanie przeglądarki
    • Użyj przeglądarki do testowania, którą można skonfigurować do usuwania wszystkich danych witryny i cookie za każdym razem, gdy przeglądarka jest zamykana.
    • Upewnij się, że przeglądarka jest zamknięta ręcznie lub przez środowisko IDE w celu zmiany konfiguracji aplikacji, użytkownika testowego lub dostawcy.
  • Użyj polecenia niestandardowego, aby otworzyć przeglądarkę w trybie InPrivate lub Incognito w programie Visual Studio:
    • Otwórz okno dialogowe Przeglądaj za pomocą z przycisku Uruchom programu Visual Studio.
    • Kliknij przycisk Dodaj.
    • Podaj ścieżkę do przeglądarki w polu Program . Następujące ścieżki wykonywalne to typowe lokalizacje instalacji systemu Windows 10. Jeśli przeglądarka jest zainstalowana w innej lokalizacji lub nie używasz systemu Windows 10, podaj ścieżkę do pliku wykonywalnego przeglądarki.
      • 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
    • W polu Argumenty podaj opcję wiersza polecenia używaną przez przeglądarkę do otwierania w trybie InPrivate lub Incognito. Niektóre przeglądarki wymagają adresu URL aplikacji.
      • Microsoft Edge: użyj -inprivate.
      • Google Chrome: użyj --incognito --new-window {URL}, gdzie {URL} jest symbolem zastępczym oznaczającym adres URL do otwarcia (na przykład https://localhost:5001).
      • Mozilla Firefox: użyj -private -url {URL}, gdzie {URL} to adres URL do otwarcia (na przykład https://localhost:5001).
    • Podaj nazwę w polu Przyjazna nazwa . Na przykład Firefox Auth Testing.
    • Wybierz przycisk OK.
    • Aby uniknąć konieczności wybierania profilu przeglądarki dla każdej iteracji testowania za pomocą aplikacji, ustaw profil jako domyślny przy użyciu przycisku Ustaw jako domyślny .
    • Upewnij się, że przeglądarka jest zamknięta przez środowisko IDE w celu zmiany konfiguracji aplikacji, użytkownika testowego lub dostawcy.

Uaktualnienia aplikacji

Działająca aplikacja może zakończyć się niepowodzeniem natychmiast po uaktualnieniu zestawu .NET Core SDK na komputerze deweloperskim lub zmianie wersji pakietów w aplikacji. W niektórych przypadkach niespójne pakiety mogą spowodować przerwanie aplikacji podczas przeprowadzania głównych uaktualnień. Większość z tych problemów można rozwiązać, wykonując następujące instrukcje:

  1. Wyczyść pamięć podręczną pakietów NuGet systemu lokalnego, wykonując polecenie dotnet nuget locals all --clear z powłoki poleceń.
  2. Usuń foldery bin i obj projektu.
  3. Przywrócenie i odbudowa projektu.
  4. Usuń wszystkie pliki w folderze wdrażania na serwerze przed ponownym wdrożeniem aplikacji.

Uwaga

Korzystanie z wersji pakietów niezgodnych z platformą docelową aplikacji nie jest obsługiwane. Aby uzyskać informację na temat pakietu, skorzystaj z Galerii NuGet.

Server Uruchamianie aplikacji

Podczas testowania i rozwiązywania problemów z hostowanym Blazor WebAssemblyrozwiązaniem upewnij się, że używasz aplikacji z Server projektu.

Sprawdzanie użytkownika

Poniższy User składnik może być używany bezpośrednio w aplikacjach lub służyć jako podstawa dalszego dostosowywania.

User.razor:

@page "/user"
@attribute [Authorize]
@using System.Text.Json
@using System.Security.Claims
@inject IAccessTokenProvider AuthorizationService

<h1>@AuthenticatedUser?.Identity?.Name</h1>

<h2>Claims</h2>

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

<h2>Access token</h2>

<p id="access-token">@AccessToken?.Value</p>

<h2>Access token claims</h2>

@foreach (var claim in GetAccessTokenClaims())
{
    <p>@(claim.Key): @claim.Value.ToString()</p>
}

@if (AccessToken != null)
{
    <h2>Access token expires</h2>

    <p>Current time: <span id="current-time">@DateTimeOffset.Now</span></p>
    <p id="access-token-expires">@AccessToken.Expires</p>

    <h2>Access token granted scopes (as reported by the API)</h2>

    @foreach (var scope in AccessToken.GrantedScopes)
    {
        <p>Scope: @scope</p>
    }
}

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

    public ClaimsPrincipal AuthenticatedUser { get; set; }
    public AccessToken AccessToken { get; set; }

    protected override async Task OnInitializedAsync()
    {
        await base.OnInitializedAsync();
        var state = await AuthenticationState;
        var accessTokenResult = await AuthorizationService.RequestAccessToken();

        if (!accessTokenResult.TryGetToken(out var token))
        {
            throw new InvalidOperationException(
                "Failed to provision the access token.");
        }

        AccessToken = token;

        AuthenticatedUser = state.User;
    }

    protected IDictionary<string, object> GetAccessTokenClaims()
    {
        if (AccessToken == null)
        {
            return new Dictionary<string, object>();
        }

        // header.payload.signature
        var payload = AccessToken.Value.Split(".")[1];
        var base64Payload = payload.Replace('-', '+').Replace('_', '/')
            .PadRight(payload.Length + (4 - payload.Length % 4) % 4, '=');

        return JsonSerializer.Deserialize<IDictionary<string, object>>(
            Convert.FromBase64String(base64Payload));
    }
}

Sprawdzanie zawartości tokenu internetowego JSON (JWT)

Aby zdekodować token internetowy JSON (JWT), użyj narzędzia jwt.ms firmy Microsoft. Wartości w interfejsie użytkownika nigdy nie opuszczają przeglądarki.

Przykład zakodowany JWT (skrócony do wyświetlania):

eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6Ilg1ZVhrNHh5b2pORnVtMWtsMll0djhkbE5QNC1j ... bQdHBHGcQQRbW7Wmo6SWYG4V_bU55Ug_PW4pLPr20tTS8Ct7_uwy9DWrzCMzpD-EiwT5IjXwlGX3IXVjHIlX50IVIydBoPQtadvT7saKo1G5Jmutgq41o-dmz6-yBMKV2_nXA25Q

Przykładowy kod JWT dekodowany przez narzędzie dla aplikacji, która uwierzytelnia się w usłudze Azure AAD B2C:

{
  "typ": "JWT",
  "alg": "RS256",
  "kid": "X5eXk4xyojNFum1kl2Ytv8dlNP4-c57dO6QGTVBwaNk"
}.{
  "exp": 1610059429,
  "nbf": 1610055829,
  "ver": "1.0",
  "iss": "https://mysiteb2c.b2clogin.com/11112222-bbbb-3333-cccc-4444dddd5555/v2.0/",
  "sub": "aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb",
  "aud": "00001111-aaaa-2222-bbbb-3333cccc4444",
  "nonce": "bbbb0000-cccc-1111-dddd-2222eeee3333",
  "iat": 1610055829,
  "auth_time": 1610055822,
  "idp": "idp.com",
  "tfp": "B2C_1_signupsignin"
}.[Signature]

Dodatkowe zasoby