Udostępnij za pośrednictwem


Zabezpieczanie hostowanej aplikacji ASP.NET Core Blazor WebAssembly przy użyciu identyfikatora Entra firmy Microsoft

W tym artykule wyjaśniono, jak utworzyć hostowane Blazor WebAssembly rozwiązanie, które używa identyfikatora Entra (ME-ID) firmy Microsoft do uwierzytelniania. Ten artykuł koncentruje się na jednej aplikacji dzierżawy z rejestracją aplikacji platformy Azure z jedną dzierżawą.

Ten artykuł nie obejmuje rejestracji wielodostępnego identyfikatora ME-ID. Aby uzyskać więcej informacji, zobacz Tworzenie aplikacji wielodostępnej.

Ten artykuł koncentruje się na użyciu dzierżawy firmy Microsoft Entra zgodnie z opisem w przewodniku Szybki start: Konfigurowanie dzierżawy. Jeśli aplikacja jest zarejestrowana w dzierżawie usługi Azure Active Directory B2C , zgodnie z opisem w artykule Samouczek: tworzenie dzierżawy usługi Azure Active Directory B2C, ale postępuje zgodnie ze wskazówkami w tym artykule, identyfikator URI identyfikatora aplikacji jest zarządzany inaczej za pomocą identyfikatora ME-ID. Aby uzyskać więcej informacji, zobacz sekcję Korzystanie z dzierżawy usługi Azure Active Directory B2C w tym artykule.

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

Przewodnik

Podsekcje przewodnika wyjaśniają, jak:

  • Tworzenie dzierżawy na platformie Azure
  • Rejestrowanie aplikacji interfejsu API serwera na platformie Azure
  • Rejestrowanie aplikacji klienckiej na platformie Azure
  • Blazor Tworzenie aplikacji
  • Modyfikowanie Server appsettings.json konfiguracji
  • Modyfikowanie domyślnego schematu zakresu tokenu dostępu
  • Uruchom aplikację

Tworzenie dzierżawy na platformie Azure

Postępuj zgodnie ze wskazówkami w przewodniku Szybki start: konfigurowanie dzierżawy w celu utworzenia dzierżawy w środowisku ME-ID.

Rejestrowanie aplikacji interfejsu API serwera na platformie Azure

Zarejestruj aplikację ME-ID dla aplikacji interfejsu API serwera:

  1. Przejdź do pozycji Microsoft Entra ID w witrynie Azure Portal. Wybierz pozycję Aplikacje> Rejestracje aplikacji na pasku bocznym. Wybierz przycisk Nowa rejestracja.
  2. Podaj nazwę aplikacji (na przykład Blazor Server ME-ID).
  3. Wybierz obsługiwane typy kont. Dla tego środowiska możesz wybrać pozycję Konta tylko w tym katalogu organizacyjnym (tylko jedna dzierżawa).
  4. Aplikacja interfejsu API serwera nie wymaga identyfikatora URI przekierowania w tym scenariuszu, dlatego pozostaw listę rozwijaną Wybierz platformę niezaznaczone i nie wprowadzaj identyfikatora URI przekierowania.
  5. W tym artykule założono, że aplikacja jest zarejestrowana w dzierżawie firmy Microsoft Entra . Jeśli aplikacja jest zarejestrowana w dzierżawie usługi Azure Active Directory B2C, pole wyboru Uprawnienia>Udziel zgody administratora na otwieranie i offline_access uprawnienia jest obecne i zaznaczone. Usuń zaznaczenie pola wyboru, aby wyłączyć ustawienie. W przypadku korzystania z dzierżawy usługi Active Azure Directory pole wyboru nie jest obecne.
  6. Wybierz pozycję Zarejestruj.

Zarejestruj następujące informacje:

  • Identyfikator aplikacji interfejsu API serwera (klienta) (na przykład 00001111-aaaa-2222-bbbb-3333cccc4444)
  • Identyfikator katalogu (dzierżawy) (na przykład aaaabbbb-0000-cccc-1111-dddd2222eeee)
  • Domena podstawowa/wydawca/dzierżawa identyfikatora me-ID (na przykład contoso.onmicrosoft.com): Domena jest dostępna jako domena wydawcy w bloku Znakowanie w witrynie Azure Portal dla zarejestrowanej aplikacji.

W obszarze Uprawnienia interfejsu API usuń uprawnienie Microsoft Graph>User.Read, ponieważ aplikacja interfejsu API serwera nie wymaga dodatkowego dostępu do interfejsu API tylko do logowania użytkowników i wywoływania punktów końcowych interfejsu API serwera.

W obszarze Uwidacznianie interfejsu API:

  1. Potwierdź lub dodaj identyfikator URI identyfikatora aplikacji w formacie api://{SERVER API APP CLIENT ID}.
  2. Wybierz Dodaj zakres.
  3. Wybierz przycisk Zapisz i kontynuuj.
  4. Podaj nazwę zakresu (na przykład API.Access).
  5. Podaj nazwę wyświetlaną zgody administratora (na przykład Access API).
  6. Podaj opis zgody administratora (na przykład Allows the app to access server app API endpoints.).
  7. Upewnij się, że stan jest ustawiony na Włączone.
  8. Wybierz Dodaj zakres.

Zarejestruj następujące informacje:

  • Identyfikator GUID identyfikatora URI aplikacji (na przykład rekord 00001111-aaaa-2222-bbbb-3333cccc4444 z identyfikatora URI identyfikatora aplikacji )api://00001111-aaaa-2222-bbbb-3333cccc4444
  • Nazwa zakresu (na przykład API.Access)

Ważne

Jeśli dla identyfikatora URI identyfikatora aplikacji jest używana wartość niestandardowa, zmiany konfiguracji są wymagane zarówno dla aplikacji, jak Server i Client po utworzeniu aplikacji na podstawie szablonu Blazor WebAssembly projektu. Aby uzyskać więcej informacji, zobacz sekcję Use of a custom App ID URI (Używanie niestandardowego identyfikatora URI identyfikatora aplikacji).

Rejestrowanie aplikacji klienckiej na platformie Azure

Zarejestruj aplikację ME-ID dla aplikacji klienckiej:

  1. Przejdź do pozycji Microsoft Entra ID w witrynie Azure Portal. Wybierz Rejestracje aplikacji na pasku bocznym. Wybierz przycisk Nowa rejestracja.
  2. Podaj nazwę aplikacji (na przykład Blazor identyfikator ME klienta).
  3. Wybierz obsługiwane typy kont. Dla tego środowiska możesz wybrać pozycję Konta tylko w tym katalogu organizacyjnym (tylko jedna dzierżawa).
  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 porty w dodanych identyfikatorach URI przekierowania produkcyjnego.
  5. W tym artykule założono, że aplikacja jest zarejestrowana w dzierżawie firmy Microsoft Entra . Jeśli aplikacja jest zarejestrowana w dzierżawie usługi Azure Active Directory B2C, pole wyboru Uprawnienia>Udziel zgody administratora na otwieranie i offline_access uprawnienia jest obecne i zaznaczone. Usuń zaznaczenie pola wyboru, aby wyłączyć ustawienie. W przypadku korzystania z dzierżawy usługi Active Azure Directory pole wyboru nie jest obecne.
  6. Wybierz pozycję Zarejestruj.

Uwaga

Podanie numeru portu identyfikatora localhost 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).

Client Zarejestruj identyfikator aplikacji (klienta) aplikacji (na przykład 11112222-bbbb-3333-cccc-4444dddd5555).

W obszarze Konfiguracja platformy uwierzytelniania>jednostronicowa>aplikacja:

  1. Upewnij się, że identyfikator URI https://localhost/authentication/login-callback przekierowania jest obecny.
  2. W sekcji Niejawne udzielanie upewnij się, że pola wyboru tokenów dostępu i tokenów identyfikatorów nie są zaznaczone. Niejawne udzielanie nie jest zalecane w przypadku Blazor aplikacji korzystających z biblioteki 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.

W obszarze Uprawnienia interfejsu API:

  1. Upewnij się, że aplikacja ma uprawnienie Microsoft Graph>User.Read.
  2. Wybierz pozycję Dodaj uprawnienie , a następnie pozycję Moje interfejsy API.
  3. Wybierz aplikację interfejsu API serwera z kolumny Nazwa (na przykład Blazor Server ME-ID). Musisz być właścicielem rejestracji aplikacji (i rejestracji aplikacji interfejsu API, jeśli jest to oddzielna aplikacja), aby zobaczyć interfejs API w obszarze Moje interfejsy API w witrynie Azure Portal. Aby uzyskać więcej informacji, zobacz Przypisywanie właściciela aplikacji (dokumentacja firmy Microsoft Entra).
  4. Otwórz listę interfejsów API .
  5. Włącz dostęp do interfejsu API (na przykład API.Access).
  6. Wybierz Przyznaj uprawnienia.
  7. Wybierz przycisk Udziel zgody administratora dla {NAZWA DZIERŻAWY}. Wybierz Tak, aby potwierdzić.

Ważne

Jeśli nie masz uprawnień administratora do udzielenia zgody administratora dzierżawie w ostatnim kroku konfiguracji uprawnień interfejsu API, ponieważ zgoda na korzystanie z aplikacji jest delegowana do użytkowników, musisz wykonać następujące dodatkowe czynności:

  • Aplikacja musi używać zaufanej domeny wydawcy.
  • Server W konfiguracji aplikacji w witrynie Azure Portal wybierz pozycję Uwidocznij interfejs API. W obszarze Autoryzowane aplikacje klienckie wybierz przycisk Dodaj aplikację kliencką. Client Dodaj identyfikator aplikacji (klienta) aplikacji (na przykład 11112222-bbbb-3333-cccc-4444dddd5555).

Blazor Tworzenie aplikacji

W pustym folderze zastąp symbole zastępcze w poniższym poleceniu informacjami zarejestrowanymi wcześniej i wykonaj polecenie w powłoce poleceń:

dotnet new blazorwasm -au SingleOrg --api-client-id "{SERVER API APP CLIENT ID}" --app-id-uri "{SERVER API APP ID URI GUID}" --client-id "{CLIENT APP CLIENT ID}" --default-scope "{DEFAULT SCOPE}" --domain "{TENANT DOMAIN}" -ho -o {PROJECT NAME} --tenant-id "{TENANT ID}"

Ostrzeżenie

Unikaj używania łączników (-) w nazwie {PROJECT NAME} aplikacji, które przerywają tworzenie identyfikatora aplikacji OIDC. Logika w szablonie Blazor WebAssembly projektu używa nazwy projektu dla identyfikatora aplikacji OIDC w konfiguracji rozwiązania. Przypadek Pascal () lub podkreślenia (BlazorSampleBlazor_Sample) są akceptowalnymi alternatywami. Aby uzyskać więcej informacji, zobacz Dashes in a hosted Blazor WebAssembly project name break OIDC security (dotnet/aspnetcore #35337).

Symbol zastępczy Nazwa witryny Azure Portal Przykład
{PROJECT NAME} BlazorSample
{CLIENT APP CLIENT ID} Identyfikator aplikacji (klienta) dla Client aplikacji 11112222-bbbb-3333-cccc-4444dddd5555
{DEFAULT SCOPE} Nazwa zakresu API.Access
{SERVER API APP CLIENT ID} Identyfikator aplikacji (klienta) dla aplikacji interfejsu API serwera 00001111-aaaa-2222-bbbb-3333cccc4444
{SERVER API APP ID URI GUID} Identyfikator GUID identyfikatora URI aplikacji 00001111-aaaa-2222-bbbb-3333cccc4444 (TYLKO identyfikator GUID, pasuje do elementu {SERVER API APP CLIENT ID})
{TENANT DOMAIN} Domena podstawowa/wydawca/dzierżawa contoso.onmicrosoft.com
{TENANT ID} Identyfikator katalogu (dzierżawcy) aaaabbbb-0000-cccc-1111-dddd2222eeee

Lokalizacja wyjściowa określona za -o|--output pomocą opcji tworzy folder projektu, jeśli nie istnieje i staje się częścią nazwy projektu. Unikaj używania łączników (-) w nazwie aplikacji, które przerywają tworzenie identyfikatora aplikacji OIDC (zobacz wcześniejsze ostrzeżenie).

Ważne

Jeśli dla identyfikatora URI identyfikatora aplikacji jest używana wartość niestandardowa, zmiany konfiguracji są wymagane zarówno dla aplikacji, jak Server i Client po utworzeniu aplikacji na podstawie szablonu Blazor WebAssembly projektu. Aby uzyskać więcej informacji, zobacz sekcję Use of a custom App ID URI (Używanie niestandardowego identyfikatora URI identyfikatora aplikacji).

Uruchom aplikację

Uruchom aplikację z Server projektu. W przypadku korzystania z programu Visual Studio:

  • Wybierz strzałkę listy rozwijanej obok przycisku Uruchom . Otwórz pozycję Konfiguruj projekty startowe z listy rozwijanej. Wybierz opcję Pojedynczy projekt startowy. Potwierdź lub zmień projekt projektu startowego na Server projekt.

  • Upewnij się, że Server projekt został wyróżniony w Eksplorator rozwiązań przed rozpoczęciem aplikacji przy użyciu dowolnego z następujących podejść:

    • Wybierz przycisk Run (Uruchom).
    • Użyj polecenia Debuguj>Rozpocznij debugowanie z menu.
    • Naciśnij klawisz F5.
  • W powłoce poleceń przejdź do Server folderu projektu rozwiązania. dotnet watch Wykonaj polecenie (lub dotnet run).

Konfigurować User.Identity.Name

Wskazówki w tej sekcji obejmują opcjonalne wypełnianie User.Identity.Name wartością oświadczenia name .

Interfejs Server API aplikacji wypełnia User.Identity.Name wartość typu http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name oświadczenia (na przykład bbbb0000-cccc-1111-dddd-2222eeee3333@contoso.onmicrosoft.com).

Aby skonfigurować aplikację do odbierania wartości z name typu oświadczenia:

Części rozwiązania

W tej sekcji opisano części rozwiązania wygenerowane na Blazor WebAssembly podstawie szablonu projektu i opisano sposób konfigurowania Client rozwiązań i Server projektów do celów referencyjnych. 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.

Konfiguracja widoku appsettings.json

Ta sekcja dotyczy aplikacji rozwiązania Server .

Plik appsettings.json zawiera opcje konfigurowania programu obsługi elementu nośnego JWT używanego do sprawdzania poprawności tokenów dostępu. Dodaj następującą AzureAd sekcję konfiguracji:

{
  "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "Domain": "{TENANT DOMAIN}",
    "TenantId": "{TENANT ID}",
    "ClientId": "{SERVER API APP CLIENT ID}",
    "CallbackPath": "/signin-oidc",
    "Scopes": "{SCOPES}"
  }
}

Przykład:

{
  "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "Domain": "contoso.onmicrosoft.com",
    "TenantId": "aaaabbbb-0000-cccc-1111-dddd2222eeee",
    "ClientId": "00001111-aaaa-2222-bbbb-3333cccc4444",
    "CallbackPath": "/signin-oidc",
    "Scopes": "API.Access"
  }
}

Ważne

Server Jeśli aplikacja jest zarejestrowana do używania niestandardowego identyfikatora URI identyfikatora aplikacji w formacie ME-ID (a nie w formacie api://{SERVER API APP CLIENT ID}domyślnym), zobacz sekcję Use of a custom App ID URI (Używanie niestandardowego identyfikatora URI identyfikatora aplikacji). Zmiany są wymagane zarówno w aplikacjach, jak Server i Client .

Pakiet uwierzytelniania

Ta sekcja dotyczy aplikacji rozwiązania Server .

Pakiet zapewnia Microsoft.Identity.Web obsługę uwierzytelniania i autoryzowania wywołań do ASP.NET Core internetowych interfejsów API platformy Microsoftidentity.

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.

Aplikacja Server hostowanego Blazor rozwiązania utworzonego na Blazor WebAssembly podstawie szablonu zawiera Microsoft.Identity.Web.UI pakiet. Pakiet dodaje interfejs użytkownika do uwierzytelniania użytkowników w aplikacjach internetowych i nie jest używany przez platformę Blazor . Server Jeśli aplikacja nie będzie używana do bezpośredniego uwierzytelniania użytkowników, można bezpiecznie usunąć odwołanie do pakietu z Server pliku projektu aplikacji.

Obsługa usługi uwierzytelniania

Ta sekcja dotyczy aplikacji rozwiązania Server .

Metoda AddAuthentication konfiguruje usługi uwierzytelniania w aplikacji i konfiguruje program obsługi elementu nośnego JWT jako domyślną metodę uwierzytelniania. Metoda AddMicrosoftIdentityWebApi konfiguruje usługi w celu ochrony internetowego interfejsu API za pomocą platformy Microsoft identity w wersji 2.0. Ta metoda oczekuje AzureAd sekcji w konfiguracji aplikacji z ustawieniami niezbędnymi do inicjowania opcji uwierzytelniania.

builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApi(Configuration.GetSection("AzureAd"));

Uwaga

Po zarejestrowaniu pojedynczego schematu uwierzytelniania schemat uwierzytelniania jest automatycznie używany jako schemat domyślny aplikacji i nie jest konieczne podanie schematu do AddAuthentication programu lub za pośrednictwem metody AuthenticationOptions. Aby uzyskać więcej informacji, zobacz Overview of ASP.NET Core Authentication and the ASP.NET Core anons (aspnet/Announcements #490).

UseAuthentication i UseAuthorization upewnij się, że:

  • Aplikacja próbuje przeanalizować i zweryfikować tokeny w żądaniach przychodzących.
  • Każde żądanie próbujące uzyskać dostęp do chronionego zasobu bez odpowiednich poświadczeń kończy się niepowodzeniem.
app.UseAuthentication();
app.UseAuthorization();

WeatherForecast kontroler

Ta sekcja dotyczy aplikacji rozwiązania Server .

Kontroler WeatherForecast (Controllers/WeatherForecastController.cs) uwidacznia chroniony interfejs API za pomocą atrybutu [Authorize] zastosowanego do kontrolera. Ważne jest, aby zrozumieć, że:

  • Atrybut [Authorize] w tym kontrolerze interfejsu API jest jedyną rzeczą, która chroni ten interfejs API przed nieautoryzowanym dostępem.
  • Atrybut [Authorize] używany w Blazor WebAssembly aplikacji służy tylko jako wskazówka dla aplikacji, którą użytkownik powinien mieć autoryzację do prawidłowego działania aplikacji.
[Authorize]
[ApiController]
[Route("[controller]")]
[RequiredScope(RequiredScopesConfigurationKey = "AzureAd:Scopes")]
public class WeatherForecastController : ControllerBase
{
    [HttpGet]
    public IEnumerable<WeatherForecast> Get()
    {
        ...
    }
}

Konfiguracja widoku wwwroot/appsettings.json

Ta sekcja dotyczy aplikacji rozwiązania Client .

Konfiguracja jest dostarczana wwwroot/appsettings.json przez plik:

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

Przykład:

{
  "AzureAd": {
    "Authority": "https://login.microsoftonline.com/e86c78e2-...-918e0565a45e",
    "ClientId": "11112222-bbbb-3333-cccc-4444dddd5555",
    "ValidateAuthority": true
  }
}

Pakiet uwierzytelniania

Ta sekcja dotyczy aplikacji rozwiązania Client .

Po utworzeniu aplikacji do korzystania z kont służbowych (SingleOrg) aplikacja automatycznie otrzymuje odwołanie do pakietu dla 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

Ta sekcja dotyczy aplikacji rozwiązania Client .

HttpClient Dodano obsługę wystąpień, które obejmują tokeny dostępu podczas podejmowania żądań do Server aplikacji.

W pliku Program:

builder.Services.AddHttpClient("{PROJECT NAME}.ServerAPI", client => 
        client.BaseAddress = new Uri(builder.HostEnvironment.BaseAddress))
    .AddHttpMessageHandler<BaseAddressAuthorizationMessageHandler>();

builder.Services.AddScoped(sp => sp.GetRequiredService<IHttpClientFactory>()
    .CreateClient("{PROJECT NAME}.ServerAPI"));

Symbol {PROJECT NAME} zastępczy to nazwa projektu podczas tworzenia rozwiązania. Na przykład podanie nazwy BlazorSample projektu powoduje utworzenie nazwy HttpClient BlazorSample.ServerAPI.

Obsługa uwierzytelniania użytkowników jest rejestrowana w kontenerze usługi przy AddMsalAuthentication użyciu metody rozszerzenia dostarczonej Microsoft.Authentication.WebAssembly.Msal przez pakiet. Ta metoda konfiguruje 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);
    options.ProviderOptions.DefaultAccessTokenScopes.Add("{SCOPE URI}");
});

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 witryny Azure Portal podczas rejestrowania aplikacji.

Zakresy tokenu dostępu

Ta sekcja dotyczy aplikacji rozwiązania Client .

Domyślne zakresy tokenów dostępu reprezentują listę zakresów tokenu dostępu, które są następujące:

  • Uwzględnione w żądaniu logowania.
  • Służy do aprowizowania tokenu dostępu bezpośrednio po uwierzytelnieniu.

Dodatkowe zakresy można dodać zgodnie z potrzebami Program w pliku:

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 Program nie może aprowizować delegowanych uprawnień użytkownika dla programu Microsoft Graph za pośrednictwem interfejsu użytkownika zgody identyfikatora entra firmy Microsoft, 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).

Przykład domyślny zakres tokenu dostępu:

options.ProviderOptions.DefaultAccessTokenScopes.Add(
    "api://00001111-aaaa-2222-bbbb-3333cccc4444/API.Access");

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

Tryb logowania

Ta sekcja dotyczy aplikacji rozwiązania Client .

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

Ta sekcja dotyczy aplikacji rozwiązania Client .

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

@using System.Net.Http
@using System.Net.Http.Json
@using Microsoft.AspNetCore.Components.Authorization
@using Microsoft.AspNetCore.Components.Forms
@using Microsoft.AspNetCore.Components.Routing
@using Microsoft.AspNetCore.Components.Web
@using Microsoft.AspNetCore.Components.Web.Virtualization
@using Microsoft.AspNetCore.Components.WebAssembly.Http
@using Microsoft.JSInterop
@using {APPLICATION ASSEMBLY}
@using {APPLICATION ASSEMBLY}.Shared

Strona indeksu

Ta sekcja dotyczy aplikacji rozwiązania Client .

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

Ta sekcja dotyczy aplikacji rozwiązania Client .

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

  • Składnik CascadingAuthenticationState zarządza udostępnianiem AuthenticationState rest 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 strukturze w wersjach ASP.NET Core Razor , znaczniki dla App składnika (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. App Sprawdź składnik (App.razor) w wygenerowanej aplikacji.

  • App Sprawdź składnik (App.razor) w źródle referencyjnym. Wybierz wersję z selektora gałęzi i wyszukaj składnik w ProjectTemplates folderze repozytorium, ponieważ App lokalizacja składnika zmieniła się na przestrzeni lat.

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

RedirectToLogin, składnik

Ta sekcja dotyczy aplikacji rozwiązania Client .

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 utrzymywany przez program , dzięki czemu może zostać zwrócony do tej strony, jeśli uwierzytelnianie zakończy się pomyślnie, użyj:
    • 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

Ta sekcja dotyczy aplikacji rozwiązania Client .

Składnik LoginDisplay () jest renderowany w składniku MainLayout (LoginDisplay.razorMainLayout.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 wylogowywuje się z aplikacji.
  • W przypadku użytkowników anonimowych:
    • Oferuje opcję rejestracji.
    • Oferuje opcję logowania.

Ze względu na zmiany w strukturze w wersjach ASP.NET Core Razor , znaczniki dla LoginDisplay składnika 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. LoginDisplay Sprawdź składnik 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 równej Hosted 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

Ta sekcja dotyczy aplikacji rozwiązania Client .

Strona utworzona Authentication przez składnik (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

Statyczne analizy statyczne typu referencyjnego dopuszczania wartości null (NRT) i kompilatora platformy .NET są obsługiwane w programie ASP.NET Core na platformie .NET 6 lub nowszym. Przed wydaniem ASP.NET Core na platformie .NET 6 string typ jest wyświetlany bez oznaczenia typu null (?).

Składnik FetchData

Ta sekcja dotyczy aplikacji rozwiązania Client .

Składnik FetchData pokazuje, jak:

  • Aprowizuj token dostępu.
  • Użyj tokenu dostępu, aby wywołać chroniony interfejs API zasobów w aplikacji Serwera .

Dyrektywa @attribute [Authorize] wskazuje Blazor WebAssembly system autoryzacji, że użytkownik musi być autoryzowany w celu odwiedzenia tego składnika. Obecność atrybutu w Client aplikacji nie uniemożliwia wywoływanie interfejsu API na serwerze bez odpowiednich poświadczeń. Aplikacja Server musi również używać [Authorize] w odpowiednich punktach końcowych, aby je prawidłowo chronić.

IAccessTokenProvider.RequestAccessToken Zajmuje się żądaniem tokenu dostępu, który można dodać do żądania w celu wywołania interfejsu API. Jeśli token jest buforowany lub usługa może aprowizować nowy token dostępu bez interakcji użytkownika, żądanie tokenu zakończy się pomyślnie. W przeciwnym razie żądanie tokenu kończy się niepowodzeniem z elementem AccessTokenNotAvailableException, który jest przechwycony w instrukcji try-catch .

Aby uzyskać rzeczywisty token do uwzględnienia w żądaniu, aplikacja musi sprawdzić, czy żądanie zakończyło się pomyślnie, wywołując metodę tokenResult.TryGetToken(out var token).

Jeśli żądanie zakończyło się pomyślnie, zmienna tokenu zostanie wypełniona tokenem dostępu. AccessToken.Value Właściwość tokenu uwidacznia ciąg literału do uwzględnienia w nagłówku Authorization żądania.

Jeśli nie można aprowizować tokenu bez interakcji z użytkownikiem, co spowoduje niepowodzenie żądania:

  • ASP.NET Core na platformie .NET 7 lub nowszym: aplikacja przechodzi do metody przy użyciu podanejAccessTokenResult.InteractionOptions, aby zezwolić AccessTokenResult.InteractiveRequestUrl na odświeżanie tokenu dostępu.
  • ASP.NET Core na platformie .NET 6 lub starszej wersji: wynik tokenu zawiera adres URL przekierowania. Przejście do tego adresu URL powoduje przejście użytkownika do strony logowania i powrót do bieżącej strony po pomyślnym uwierzytelnieniu.
@page "/fetchdata"
@using Microsoft.AspNetCore.Authorization
@using Microsoft.AspNetCore.Components.WebAssembly.Authentication
@using {APP NAMESPACE}.Shared
@attribute [Authorize]
@inject HttpClient Http

...

@code {
    private WeatherForecast[] forecasts;

    protected override async Task OnInitializedAsync()
    {
        try
        {
            forecasts = await Http.GetFromJsonAsync<WeatherForecast[]>("WeatherForecast");
        }
        catch (AccessTokenNotAvailableException exception)
        {
            exception.Redirect();
        }
    }
}

Korzystanie z dzierżawy usługi Azure Active Directory B2C

Jeśli aplikacja jest zarejestrowana w dzierżawie usługi Azure Active Directory B2C , zgodnie z opisem w artykule Samouczek: tworzenie dzierżawy usługi Azure Active Directory B2C, ale postępuje zgodnie ze wskazówkami w tym artykule, identyfikator URI identyfikatora aplikacji jest zarządzany inaczej za pomocą identyfikatora ME-ID.

Typ dzierżawy istniejącej dzierżawy można sprawdzić, wybierając link Zarządzaj dzierżawami w górnej części strony Przegląd organizacji ME-ID. Sprawdź wartość kolumny Typ dzierżawy dla organizacji. Ta sekcja dotyczy aplikacji, które są zgodne ze wskazówkami w tym artykule, ale które są zarejestrowane w dzierżawie usługi Azure Active Directory B2C .

Zamiast identyfikatora URI identyfikatora aplikacji pasującego do formatu api://{SERVER API APP CLIENT ID OR CUSTOM VALUE}, identyfikator URI identyfikatora aplikacji ma format https://{TENANT}.onmicrosoft.com/{SERVER API APP CLIENT ID OR CUSTOM VALUE}. Ta różnica ma wpływ na konfiguracje Client aplikacji i Server :

  • W przypadku aplikacji interfejsu API serwera ustaw wartość Audience w pliku ustawień aplikacji (appsettings.json), aby dopasować odbiorców aplikacji (identyfikator URI identyfikatora aplikacji) dostarczonego przez witrynę Azure Portal bez końcowego ukośnika:

    "Audience": "https://{TENANT}.onmicrosoft.com/{SERVER API APP CLIENT ID OR CUSTOM VALUE}"
    

    Przykład:

    "Audience": "https://contoso.onmicrosoft.com/00001111-aaaa-2222-bbbb-3333cccc4444"
    
  • Program W pliku Client aplikacji ustaw odbiorców zakresu (identyfikator URI identyfikatora aplikacji) tak, aby był zgodny z odbiorcami aplikacji interfejsu API serwera:

    options.ProviderOptions.DefaultAccessTokenScopes
        .Add("https://{TENANT}.onmicrosoft.com/{SERVER API APP CLIENT ID OR CUSTOM VALUE}/{DEFAULT SCOPE}");
    

    W poprzednim zakresie identyfikator URI/odbiorcy identyfikatora aplikacji jest https://{TENANT}.onmicrosoft.com/{SERVER API APP CLIENT ID OR CUSTOM VALUE} częścią wartości, która nie zawiera końcowego ukośnika (/) i nie zawiera nazwy zakresu ({DEFAULT SCOPE}).

    Przykład:

    options.ProviderOptions.DefaultAccessTokenScopes
        .Add("https://contoso.onmicrosoft.com/00001111-aaaa-2222-bbbb-3333cccc4444/API.Access");
    

    W poprzednim zakresie identyfikator URI/odbiorcy identyfikatora aplikacji jest https://contoso.onmicrosoft.com/00001111-aaaa-2222-bbbb-3333cccc4444 częścią wartości, która nie zawiera końcowego ukośnika (/) i nie zawiera nazwy zakresu (API.Access).

Używanie niestandardowego identyfikatora URI identyfikatora aplikacji

Jeśli identyfikator URI identyfikatora aplikacji jest wartością niestandardową, musisz ręcznie zaktualizować domyślny identyfikator URI zakresu tokenu dostępu w Client aplikacji i dodać odbiorców do Server konfiguracji me-ID aplikacji.

Ważne

Poniższa konfiguracja nie jest wymagana w przypadku używania domyślnego identyfikatora URI identyfikatora aplikacji .api://{SERVER API APP CLIENT ID}

Przykładowy identyfikator URI urn://custom-app-id-uri identyfikatora aplikacji i nazwa zakresu :API.Access

  • Program W pliku Client aplikacji:

    options.ProviderOptions.DefaultAccessTokenScopes.Add(
        "urn://custom-app-id-uri/API.Access");
    
  • Server W appsettings.json aplikacji dodaj Audience wpis z tylko identyfikatorem URI identyfikatora aplikacji i bez końcowego ukośnika:

    "Audience": "urn://custom-app-id-uri"
    

Rozwiązywanie problemów

Rejestrowanie

Aby włączyć rejestrowanie debugowania lub śledzenia na potrzeby Blazor WebAssembly uwierzytelniania, zobacz sekcję Rejestrowanie uwierzytelniania po stronie klienta ASP.NET Core Blazor z selektorem wersji artykułu ustawionym 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 urząd, wystąpienie, identyfikator dzierżawy, domena dzierżawy, identyfikator klienta lub identyfikator 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ż jest skonfigurowane w identyfikatorze URI przekierowania rejestracji aplikacji adresu IP. Należy pamiętać, że port nie jest wymagany dla identyfikatora Entra firmy Microsoft i aplikacji działającej localhost na adresie testowania programowania, ale konfiguracja portu aplikacji i port, na którym działa aplikacja, musi być zgodna z adresami innychlocalhost niż.

    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. Narzędzia programistyczne wskazówki można znaleźć 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 usterek w artykułach (otwórz problem z sekcji Ta strona opinii), ale nie może zapewnić pomocy technicznej dotyczącej produktów. 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 struktury niezwiązanych z zabezpieczeniami, niewrażliwych i nieufnych, otwórz problem z jednostką 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 dla identyfikatora ME

    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 z metod zapobiegania utrzymującym się plikom cookie i danym witryny jest zakłócanie testowania i rozwiązywania problemów:

  • Konfigurowanie przeglądarki
    • Użyj przeglądarki do testowania, które można skonfigurować, aby usuwać wszystkie cookie dane witryny i za każdym razem, gdy przeglądarka jest zamknięta.
    • 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 polecenia -inprivate.
      • Google Chrome: użyj symbolu --incognito --new-window {URL}{URL} zastępczego , gdzie symbol zastępczy to adres URL do otwarcia (na przykład https://localhost:5001).
      • Mozilla Firefox: użyj symbolu -private -url {URL}zastępczego {URL} , gdzie symbol zastępczy jest adresem 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 i obj foldery bin projektu.
  3. Przywracanie i ponowne kompilowanie 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ć informacje na temat pakietu, użyj galerii NuGet lub Eksploratora pakietów FuGet.

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