Zabezpieczanie aplikacji internetowej ASP.NET Core Blazor za pomocą Połączenie OpenID (OIDC)

W tym artykule opisano sposób zabezpieczania Blazor aplikacji internetowej przy użyciu identyfikatora OpenID Połączenie (OIDC) przy użyciu przykładowej aplikacji w dotnet/blazor-samples repozytorium GitHub (.NET 8 lub nowszym) (jak pobrać).

W tej wersji artykułu opisano implementację OIDC bez wdrażania wzorca zaplecza dla frontonu (BFF). Wzorzec BFF jest przydatny do podejmowania uwierzytelnionych żądań do usług zewnętrznych. Zmień selektor wersji artykułu na OIDC ze wzorcem BFF, jeśli specyfikacja aplikacji wywołuje wdrożenie wzorca BFF.

Opisano następującą specyfikację:

  • Aplikacja Blazor internetowa używa trybu automatycznego renderowania z globalną interakcyjnością.
  • Niestandardowe usługi dostawcy stanu uwierzytelniania są używane przez serwer i aplikacje klienckie do przechwytywania stanu uwierzytelniania użytkownika i przepływu go między serwerem a klientem.
  • Ta aplikacja jest punktem wyjścia dla dowolnego przepływu uwierzytelniania OIDC. OIDC jest konfigurowany ręcznie w aplikacji i nie polega na pakietach Microsoft Entra ID ani Microsoft Identity Web , ani nie wymaga hostingu platformy Microsoft Azure . Jednak przykładowa aplikacja może być używana z aplikacją Entra, Microsoft Identity Web i hostowaną na platformie Azure.
  • Automatyczne odświeżanie tokenu nieinterakcyjnego.
  • Bezpiecznie wywołuje (internetowy) interfejs API w projekcie serwera na potrzeby danych.

Przykładowa aplikacja

Przykładowa aplikacja składa się z dwóch projektów:

  • BlazorWebAppOidc: Projekt po stronie serwera aplikacji internetowej zawierający przykładowy punkt końcowy interfejsu Blazor API minimalny dla danych pogodowych.
  • BlazorWebAppOidc.Client: Projekt Blazor po stronie klienta aplikacji internetowej.

Uzyskaj dostęp do przykładowych aplikacji za pośrednictwem folderu najnowszej wersji z katalogu głównego repozytorium przy użyciu następującego linku. Projekty znajdują się w folderze BlazorWebAppOidc .NET 8 lub nowszym.

Wyświetl lub pobierz przykładowy kod (jak pobrać)

Projekt aplikacji internetowej po stronie Blazor serwera (BlazorWebAppOidc)

Projekt BlazorWebAppOidc jest projektem Blazor po stronie serwera aplikacji internetowej.

Plik BlazorWebAppOidc.http może służyć do testowania żądania danych pogodowych. Należy pamiętać, że BlazorWebAppOidc projekt musi być uruchomiony, aby przetestować punkt końcowy, a punkt końcowy jest zakodowany w pliku. Aby uzyskać więcej informacji, zobacz Use .http files in Visual Studio 2022 (Używanie plików HTTP w programie Visual Studio 2022).

Uwaga

Projekt serwera używa elementu IHttpContextAccessor/HttpContext, ale nigdy nie jest używany w przypadku składników renderowanych interaktywnie. Aby uzyskać więcej informacji, zobacz Wskazówki dotyczące ograniczania zagrożeń dotyczące renderowania interaktywnego po stronie serwera ASP.NET CoreBlazor.

Konfigurowanie

W tej sekcji wyjaśniono, jak skonfigurować przykładową aplikację.

Uwaga

W przypadku usługi Microsoft Entra ID i Azure AD B2C można użyć z AddMicrosoftIdentityWebAppwitryny Microsoft Identity Web (Microsoft.Identity.Webpakiet NuGet, dokumentacja interfejsu API), która dodaje zarówno OIDC, jak i Cookie programy obsługi uwierzytelniania z odpowiednimi wartościami domyślnymi. Przykładowa aplikacja i wskazówki zawarte w tej sekcji nie korzystają z witryny Microsoft Identity Web. Wskazówki pokazują, jak ręcznie skonfigurować procedurę obsługi OIDC dla dowolnego dostawcy OIDC. Aby uzyskać więcej informacji na temat implementowania sieci Web firmy Microsoft Identity , zobacz połączone zasoby.

Następująca OpenIdConnectOptions konfiguracja znajduje się w pliku projektu Program w wywołaniu metody AddOpenIdConnect:

  • SignInScheme: Ustawia schemat uwierzytelniania odpowiadający programowi pośredniczącemu odpowiedzialnemu za utrwalanie tożsamości użytkownika po pomyślnym uwierzytelnieniu. Procedura obsługi OIDC musi używać schematu logowania, który może utrwalać poświadczenia użytkownika między żądaniami. Poniższy wiersz jest obecny jedynie w celach demonstracyjnych. W przypadku pominięcia DefaultSignInScheme parametr jest używany jako wartość rezerwowa.

    oidcOptions.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    
  • Zakresy dla openid elementów i profile () (Scopeopcjonalnie): openid zakresy i profile są również konfigurowane domyślnie, ponieważ są one wymagane, aby program obsługi OIDC działał, ale może być konieczne ponowne dodanie tych zakresów, jeśli zakresy są uwzględnione w Authentication:Schemes:MicrosoftOidc:Scope konfiguracji. Aby uzyskać ogólne wskazówki dotyczące konfiguracji, zobacz Konfiguracja w konfiguracji ASP.NET Core i ASP.NET CoreBlazor.

    oidcOptions.Scope.Add(OpenIdConnectScope.OpenIdProfile);
    
  • SaveTokens: określa, czy tokeny dostępu i odświeżania powinny być przechowywane w AuthenticationProperties tokenach po pomyślnym uwierzytelnieniu. Ta właściwość jest domyślnie ustawiona false w celu zmniejszenia rozmiaru uwierzytelniania cookiekońcowego.

    oidcOptions.SaveTokens = false;
    
  • Zakres dostępu w trybie offline (Scope): offline_access zakres jest wymagany dla tokenu odświeżania.

    oidcOptions.Scope.Add(OpenIdConnectScope.OfflineAccess);
    
  • Authority i ClientId: Ustawia urząd i identyfikator klienta dla wywołań OIDC.

    oidcOptions.Authority = "{AUTHORITY}";
    oidcOptions.ClientId = "{CLIENT ID}";
    

    Przykład:

    • Urząd (): https://login.microsoftonline.com/a3942615-d115-4eb7-bc84-9974abcf5064/v2.0/ ({AUTHORITY}używa identyfikatora a3942615-d115-4eb7-bc84-9974abcf5064dzierżawy )
    • Identyfikator klienta ({CLIENT ID}): 4ba4de56-9cef-45d9-83fa-a4c18f9f5f0f
    oidcOptions.Authority = "https://login.microsoftonline.com/a3942615-d115-4eb7-bc84-9974abcf5064/v2.0/";
    oidcOptions.ClientId = "4ba4de56-9cef-45d9-83fa-a4c18f9f5f0f";
    

    Przykład dla urzędu "common" platformy Microsoft Azure:

    Dla aplikacji wielodostępnych należy używać "wspólnego" urzędu. Możesz również użyć "wspólnego" urzędu dla aplikacji z jedną dzierżawą, ale jest wymagany niestandardowy IssuerValidator , jak pokazano w dalszej części tej sekcji.

    oidcOptions.Authority = "https://login.microsoftonline.com/common/v2.0/";
    
  • ClientSecret: wpis tajny klienta OIDC.

    Poniższy przykład dotyczy tylko celów testowych i demonstracyjnych. Nie przechowuj wpisu tajnego klienta w zestawie aplikacji ani nie sprawdzaj wpisu tajnego w kontroli źródła. Zapisz wpis tajny klienta w wpisach tajnych użytkownika, usłudze Azure Key Vault lub zmiennej środowiskowej.

    Konfiguracja schematu uwierzytelniania jest automatycznie odczytywana z builder.Configuration["Authentication:Schemes:{SCHEME NAME}:{PropertyName}"]elementu , gdzie {SCHEME NAME} symbol zastępczy jest schematem, który jest MicrosoftOidc domyślnie. Ponieważ konfiguracja jest wstępnie skonfigurowana, klucz tajny klienta może być automatycznie odczytywany za pośrednictwem Authentication:Schemes:MicrosoftOidc:ClientSecret klucza konfiguracji. Na serwerze przy użyciu zmiennych środowiskowych nazwij zmienną środowiskową Authentication__Schemes__MicrosoftOidc__ClientSecret:

    set Authentication__Schemes__MicrosoftOidc__ClientSecret={CLIENT SECRET}
    

    Tylko w przypadku demonstracji i testowaniaClientSecret można ustawić bezpośrednio. Nie ustawiaj wartości bezpośrednio dla wdrożonych aplikacji produkcyjnych. W przypadku nieco ulepszonych zabezpieczeń warunkowo skompiluj wiersz z symbolem DEBUG :

    #if DEBUG
    oidcOptions.ClientSecret = "{CLIENT SECRET}";
    #endif
    

    Przykład:

    Klucz tajny klienta (): 463471c8c4...f90d674bc9 ({CLIENT SECRET}skrócony do wyświetlania)

    #if DEBUG
    oidcOptions.ClientSecret = "463471c8c4...137f90d674bc9";
    #endif
    
  • ResponseType: Konfiguruje procedurę obsługi OIDC tak, aby wykonywała tylko przepływ kodu autoryzacji. Niejawne dotacje i przepływy hybrydowe są niepotrzebne w tym trybie.

    W konfiguracji niejawnego udzielania i rejestracji aplikacji przepływów hybrydowych w witrynie Entra lub Witryny Azure Portal nie zaznaczaj pola wyboru dla punktu końcowego autoryzacji w celu zwrócenia tokenów dostępu lub tokenów identyfikatorów. Procedura obsługi OIDC automatycznie żąda odpowiednich tokenów przy użyciu kodu zwróconego z punktu końcowego autoryzacji.

    oidcOptions.ResponseType = OpenIdConnectResponseType.Code;
    
  • MapInboundClaims i konfiguracja NameClaimType i RoleClaimType: Wiele serwerów OIDC używa wartości "name" i "role", a nie wartości domyślnych protokołu SOAP/WS-Fed w systemie ClaimTypes. Gdy MapInboundClaims jest ustawiona wartość false, program obsługi nie wykonuje mapowań oświadczeń, a nazwy oświadczeń z zestawu JWT są używane bezpośrednio przez aplikację. Poniższy przykład ręcznie mapuje oświadczenia nazw i ról:

Uwaga

MapInboundClaims musi być ustawiona na false wartość dla większości dostawców OIDC, co uniemożliwia zmianę nazw oświadczeń.

oidcOptions.MapInboundClaims = false;
oidcOptions.TokenValidationParameters.NameClaimType = JwtRegisteredClaimNames.Name;
oidcOptions.TokenValidationParameters.RoleClaimType = "role";
  • Konfiguracja ścieżki: ścieżki muszą być zgodne z identyfikatorem URI przekierowania (ścieżką wywołania zwrotnego logowania) i ścieżkami przekierowania wylogowania (ścieżki wywołania zwrotnego wylogowywanego) skonfigurowanymi podczas rejestrowania aplikacji u dostawcy OIDC. W witrynie Azure Portal ścieżki są konfigurowane w bloku Uwierzytelnianie rejestracji aplikacji. Zarówno ścieżki logowania, jak i wylogowania muszą być zarejestrowane jako identyfikatory URI przekierowania. Wartości domyślne to /signin-oidc i /signout-callback-oidc.

    • CallbackPath: ścieżka żądania w ścieżce podstawowej aplikacji, w której jest zwracany agent użytkownika.

      W witrynie Entra lub Azure Portal ustaw ścieżkę w identyfikatorze URI przekierowania platformy internetowej:

      https://localhost/signin-oidc

      Uwaga

      Port nie jest wymagany dla localhost adresów w przypadku korzystania z identyfikatora Entra firmy Microsoft. Większość innych dostawców OIDC wymaga poprawnego portu.

    • SignedOutCallbackPath: ścieżka żądania w ścieżce podstawowej aplikacji, w której agent użytkownika jest zwracany po wylogowaniu się od dostawcy tożsamości.

      W witrynie Entra lub Azure Portal ustaw ścieżkę w identyfikatorze URI przekierowania platformy internetowej:

      https://localhost/signout-callback-oidc

      Uwaga

      Port nie jest wymagany dla localhost adresów w przypadku korzystania z identyfikatora Entra firmy Microsoft. Większość innych dostawców OIDC wymaga poprawnego portu.

      Uwaga

      Jeśli korzystasz z sieci Web firmy Microsoft Identity , dostawca obecnie przekierowuje tylko z powrotem do SignedOutCallbackPath adresu , jeśli microsoftonline.com jest używany urząd (https://login.microsoftonline.com/{TENANT ID}/v2.0/). To ograniczenie nie istnieje, jeśli możesz użyć "wspólnego" urzędu z siecią Microsoft Identity Web. Aby uzyskać więcej informacji, zobacz postLogoutRedirectUri nie działa, gdy adres URL urzędu zawiera identyfikator dzierżawy (AzureAD/microsoft-authentication-library-for-js #5783).

    • RemoteSignOutPath: Żądania odebrane na tej ścieżce powodują, że program obsługi wywołuje wylogowywanie przy użyciu schematu wylogowywanie.

      W witrynie Entra lub Azure Portal ustaw adres URL wylogowywania kanału frontonu:

      https://localhost/signout-oidc

      Uwaga

      Port nie jest wymagany dla localhost adresów w przypadku korzystania z identyfikatora Entra firmy Microsoft. Większość innych dostawców OIDC wymaga poprawnego portu.

    oidcOptions.CallbackPath = new PathString("{PATH}");
    oidcOptions.SignedOutCallbackPath = new PathString("{PATH}");
    oidcOptions.RemoteSignOutPath = new PathString("{PATH}");
    

    Przykłady (wartości domyślne):

    oidcOptions.CallbackPath = new PathString("/signin-oidc");
    oidcOptions.SignedOutCallbackPath = new PathString("/signout-callback-oidc");
    oidcOptions.RemoteSignOutPath = new PathString("/signout-oidc");
    
  • (Platforma Microsoft Azure tylko w przypadku "wspólnego" punktu końcowego): TokenValidationParameters.IssuerValidatorwielu dostawców OIDC współpracuje z domyślnym modułem sprawdzania poprawności wystawcy, ale musimy uwzględnić wystawcę sparametryzowanego przy użyciu identyfikatora dzierżawy ({TENANT ID}) zwróconego przez https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration. Aby uzyskać więcej informacji, zobacz SecurityTokenInvalidIssuerException with OpenID Połączenie and the Azure AD "common" endpoint (AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet #1731).

    Tylko w przypadku aplikacji korzystających z identyfikatora Entra firmy Microsoft lub usługi Azure AD B2C z "wspólnym" punktem końcowym:

    var microsoftIssuerValidator = AadIssuerValidator.GetAadIssuerValidator(oidcOptions.Authority);
    oidcOptions.TokenValidationParameters.IssuerValidator = microsoftIssuerValidator.Validate;
    

Przykładowy kod aplikacji

Sprawdź przykładową aplikację pod kątem następujących funkcji:

  • Automatyczne odświeżanie tokenu nieinterakcyjnego przy użyciu niestandardowego cookie modułu odświeżania (CookieOidcRefresher.cs).
  • Klasa PersistingAuthenticationStateProvider (PersistingAuthenticationStateProvider.cs) jest po stronie AuthenticationStateProvider serwera, która używa PersistentComponentState do przepływu stanu uwierzytelniania do klienta, który jest następnie stały przez okres istnienia aplikacji WebAssembly.
  • Przykładowe żądania do Blazor aplikacji internetowej dla danych pogodowych są obsługiwane przez minimalny punkt końcowy interfejsu Program API (/weather-forecast) w pliku (Program.cs). Punkt końcowy wymaga autoryzacji przez wywołanie metody RequireAuthorization. W przypadku wszystkich kontrolerów dodanych do projektu dodaj [Authorize] atrybut do kontrolera lub akcji.
  • Aplikacja bezpiecznie wywołuje (internetowy) interfejs API w projekcie serwera na potrzeby danych pogodowych:
    • Podczas renderowania Weather składnika na serwerze składnik używa ServerWeatherForecaster elementu na serwerze do bezpośredniego uzyskiwania danych pogodowych (nie za pośrednictwem wywołania internetowego interfejsu API).
    • Gdy składnik jest renderowany na kliencie, składnik używa ClientWeatherForecaster implementacji usługi, która używa wstępnie skonfigurowanego HttpClient (w pliku projektu Program klienta) do wywołania internetowego interfejsu API do projektu serwera. Minimalny punkt końcowy interfejsu API (/weather-forecast) zdefiniowany w pliku projektu Program serwera uzyskuje dane pogodowe z ServerWeatherForecaster elementu i zwraca dane do klienta.

Aby uzyskać więcej informacji na temat wywołań interfejsu API sieci Web przy użyciu abstrakcji usługi w Blazor usłudze Web Apps, zobacz Wywoływanie internetowego interfejsu API z aplikacji ASP.NET CoreBlazor.

Projekt aplikacji internetowej po stronie Blazor klienta (BlazorWebAppOidc.Client)

Projekt BlazorWebAppOidc.Client jest projektem Blazor po stronie klienta aplikacji internetowej.

Klasa PersistentAuthenticationStateProvider (PersistentAuthenticationStateProvider.cs) to po stronie AuthenticationStateProvider klienta, która określa stan uwierzytelniania użytkownika, wyszukując dane utrwalone na stronie podczas renderowania na serwerze. Stan uwierzytelniania jest stały dla okresu istnienia aplikacji WebAssembly.

Jeśli użytkownik musi się zalogować lub wylogować, wymagane jest ponowne załadowanie pełnej strony.

Przykładowa aplikacja udostępnia tylko nazwę użytkownika i adres e-mail do celów wyświetlania. Nie obejmuje tokenów uwierzytelniających się na serwerze podczas podejmowania kolejnych żądań, które działają oddzielnie przy użyciu elementu cookie uwzględnionego w HttpClient żądaniach do serwera.

W tej wersji artykułu opisano implementację OIDC ze wzorcem zaplecza frontonu (BFF). Zmień selektor wersji artykułu na OIDC bez wzorca BFF, jeśli specyfikacja aplikacji nie wywołuje wdrożenia wzorca BFF.

Opisano następującą specyfikację:

  • Aplikacja Blazor internetowa używa trybu automatycznego renderowania z globalną interakcyjnością.
  • Niestandardowe usługi dostawcy stanu uwierzytelniania są używane przez serwer i aplikacje klienckie do przechwytywania stanu uwierzytelniania użytkownika i przepływu go między serwerem a klientem.
  • Ta aplikacja jest punktem wyjścia dla dowolnego przepływu uwierzytelniania OIDC. OIDC jest konfigurowany ręcznie w aplikacji i nie polega na pakietach Microsoft Entra ID ani Microsoft Identity Web , ani nie wymaga hostingu platformy Microsoft Azure . Jednak przykładowa aplikacja może być używana z aplikacją Entra, Microsoft Identity Web i hostowaną na platformie Azure.
  • Automatyczne odświeżanie tokenu nieinterakcyjnego.
  • Wzorzec zaplecza frontonu (BFF) jest używany przy użyciu platformy .NET Aspire na potrzeby odnajdywania usług i yaRP na potrzeby proxy żądań do punktu końcowego prognozy pogody w aplikacji zaplecza.
    • Internetowy interfejs API zaplecza używa uwierzytelniania elementu nośnego JWT do weryfikowania tokenów JWT zapisanych przez aplikację Blazor internetową w logowaniu cookie.
    • Aspirowanie usprawnia tworzenie aplikacji natywnych dla chmury platformy .NET. Zapewnia spójny, opiniowany zestaw narzędzi i wzorców do tworzenia i uruchamiania aplikacji rozproszonych.
    • YARP (Jeszcze inny zwrotny serwer proxy) to biblioteka używana do tworzenia zwrotnego serwera proxy.

Ostrzeżenie o pakiecie w wersji zapoznawczej

Ostrzeżenie

Technologie i pakiety używane przez przykładową BlazorWebAppOidcBff aplikację i opisane w tym artykule są obecnie w wersji zapoznawczej . Zawartość artykułu, interfejs API i przykładowa aplikacja nie są obecnie obsługiwane i nie są obecnie zalecane do użytku produkcyjnego. Przykładowa aplikacja i wskazówki mogą ulec zmianie bez powiadomienia.

Warunek wstępny

Program .NET Aspire wymaga programu Visual Studio w wersji 17.10 lub nowszej.

Przykładowa aplikacja

Przykładowa aplikacja składa się z pięciu projektów:

  • .NET Aspire:
    • Aspire.AppHost: służy do zarządzania problemami dotyczącymi orkiestracji wysokiego poziomu aplikacji.
    • Aspire.ServiceDefaults: zawiera domyślne konfiguracje aplikacji .NET Aspire, które można rozszerzyć i dostosować zgodnie z potrzebami.
  • MinimalApiJwt: internetowy interfejs API zaplecza zawierający przykładowy minimalny punkt końcowy interfejsu API dla danych pogodowych.
  • BlazorWebAppOidc: projekt Blazor po stronie serwera aplikacji internetowej.
  • BlazorWebAppOidc.Client: Projekt Blazor po stronie klienta aplikacji internetowej.

Uzyskaj dostęp do przykładowych aplikacji za pośrednictwem folderu najnowszej wersji z katalogu głównego repozytorium przy użyciu następującego linku. Projekty znajdują się w folderze BlazorWebAppOidcBff .NET 8 lub nowszym.

Wyświetl lub pobierz przykładowy kod (jak pobrać)

Projekty .NET Aspire

Aby uzyskać więcej informacji na temat korzystania z platformy .NET Aspire i szczegółów dotyczących .AppHost projektów przykładowej .ServiceDefaults aplikacji, zobacz dokumentację platformy .NET Aspire.

Upewnij się, że spełniono wymagania wstępne dotyczące platformy .NET Aspire. Aby uzyskać więcej informacji, zobacz sekcję Wymagania wstępne przewodnika Szybki start: tworzenie pierwszej aplikacji .NET Aspire.

Projekt aplikacji internetowej po stronie Blazor serwera (BlazorWebAppOidc)

Projekt BlazorWebAppOidc jest projektem Blazor po stronie serwera aplikacji internetowej. Projekt używa yaRP do proxy żądań do punktu końcowego prognozy pogody w projekcie internetowego interfejsu API zaplecza (MinimalApiJwt) z przechowywanym access_token w uwierzytelnianiu cookie.

Plik BlazorWebAppOidc.http może służyć do testowania żądania danych pogodowych. Należy pamiętać, że BlazorWebAppOidc projekt musi być uruchomiony, aby przetestować punkt końcowy, a punkt końcowy jest zakodowany w pliku. Aby uzyskać więcej informacji, zobacz Use .http files in Visual Studio 2022 (Używanie plików HTTP w programie Visual Studio 2022).

Uwaga

Projekt serwera używa elementu IHttpContextAccessor/HttpContext, ale nigdy nie jest używany w przypadku składników renderowanych interaktywnie. Aby uzyskać więcej informacji, zobacz Wskazówki dotyczące ograniczania zagrożeń dotyczące renderowania interaktywnego po stronie serwera ASP.NET CoreBlazor.

Konfigurowanie

W tej sekcji wyjaśniono, jak skonfigurować przykładową aplikację.

Uwaga

W przypadku usługi Microsoft Entra ID i Azure AD B2C można użyć z AddMicrosoftIdentityWebAppwitryny Microsoft Identity Web (Microsoft.Identity.Webpakiet NuGet, dokumentacja interfejsu API), która dodaje zarówno OIDC, jak i Cookie programy obsługi uwierzytelniania z odpowiednimi wartościami domyślnymi. Przykładowa aplikacja i wskazówki zawarte w tej sekcji nie korzystają z witryny Microsoft Identity Web. Wskazówki pokazują, jak ręcznie skonfigurować procedurę obsługi OIDC dla dowolnego dostawcy OIDC. Aby uzyskać więcej informacji na temat implementowania sieci Web firmy Microsoft Identity , zobacz połączone zasoby.

Następująca OpenIdConnectOptions konfiguracja znajduje się w pliku projektu Program w wywołaniu metody AddOpenIdConnect:

  • SignInScheme: Ustawia schemat uwierzytelniania odpowiadający programowi pośredniczącemu odpowiedzialnemu za utrwalanie tożsamości użytkownika po pomyślnym uwierzytelnieniu. Procedura obsługi OIDC musi używać schematu logowania, który może utrwalać poświadczenia użytkownika między żądaniami. Poniższy wiersz jest obecny jedynie w celach demonstracyjnych. W przypadku pominięcia DefaultSignInScheme parametr jest używany jako wartość rezerwowa.

    oidcOptions.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    
  • Zakresy dla openid elementów i profile () (Scopeopcjonalnie): openid zakresy i profile są również konfigurowane domyślnie, ponieważ są one wymagane, aby program obsługi OIDC działał, ale może być konieczne ponowne dodanie tych zakresów, jeśli zakresy są uwzględnione w Authentication:Schemes:MicrosoftOidc:Scope konfiguracji. Aby uzyskać ogólne wskazówki dotyczące konfiguracji, zobacz Konfiguracja w konfiguracji ASP.NET Core i ASP.NET CoreBlazor.

    oidcOptions.Scope.Add(OpenIdConnectScope.OpenIdProfile);
    
  • SaveTokens: określa, czy tokeny dostępu i odświeżania powinny być przechowywane w AuthenticationProperties tokenach po pomyślnym uwierzytelnieniu. Wartość jest ustawiona na wartość , aby uwierzytelniać true żądania dotyczące danych pogodowych z projektu internetowego interfejsu API zaplecza (MinimalApiJwt).

    oidcOptions.SaveTokens = true;
    
  • Zakres dostępu w trybie offline (Scope): offline_access zakres jest wymagany dla tokenu odświeżania.

    oidcOptions.Scope.Add(OpenIdConnectScope.OfflineAccess);
    
  • Zakresy uzyskiwania danych pogodowych z internetowego interfejsu API (Scope): Weather.Get zakres jest skonfigurowany w witrynie Azure lub w witrynie Entra Portal w obszarze Uwidacznij interfejs API. Jest to konieczne, aby projekt internetowego interfejsu API zaplecza (MinimalApiJwt) zweryfikował token dostępu za pomocą elementu nośnego JWT.

    oidcOptions.Scope.Add("{APP ID URI}/{API NAME}");
    

    Przykład:

    • Identyfikator URI identyfikatora aplikacji ({APP ID URI}): https://{DIRECTORY NAME}.onmicrosoft.com/{CLIENT ID}
      • Nazwa katalogu ({DIRECTORY NAME}): contoso
      • Identyfikator aplikacji (klienta) ({CLIENT ID}): 4ba4de56-9cef-45d9-83fa-a4c18f9f5f0f
    • Zakres skonfigurowany dla danych pogodowych z MinimalApiJwt ({API NAME}): Weather.Get
    oidcOptions.Scope.Add("https://contoso.onmicrosoft.com/4ba4de56-9cef-45d9-83fa-a4c18f9f5f0f/Weather.Get");
    

    Powyższy przykład dotyczy aplikacji zarejestrowanej w dzierżawie z typem dzierżawy usługi AAD B2C. Jeśli aplikacja jest zarejestrowana w dzierżawie ME-ID, identyfikator URI identyfikatora aplikacji jest inny, dlatego zakres jest inny.

    Przykład:

    • Identyfikator URI identyfikatora aplikacji ({APP ID URI}): api://{CLIENT ID} z identyfikatorem aplikacji (klient) ({CLIENT ID}): 4ba4de56-9cef-45d9-83fa-a4c18f9f5f0f
    • Zakres skonfigurowany dla danych pogodowych z MinimalApiJwt ({API NAME}): Weather.Get
    oidcOptions.Scope.Add("api://4ba4de56-9cef-45d9-83fa-a4c18f9f5f0f/Weather.Get");
    
  • Authority i ClientId: Ustawia urząd i identyfikator klienta dla wywołań OIDC.

    oidcOptions.Authority = "{AUTHORITY}";
    oidcOptions.ClientId = "{CLIENT ID}";
    

    Przykład:

    • Urząd (): https://login.microsoftonline.com/a3942615-d115-4eb7-bc84-9974abcf5064/v2.0/ ({AUTHORITY}używa identyfikatora a3942615-d115-4eb7-bc84-9974abcf5064dzierżawy )
    • Identyfikator klienta ({CLIENT ID}): 4ba4de56-9cef-45d9-83fa-a4c18f9f5f0f
    oidcOptions.Authority = "https://login.microsoftonline.com/a3942615-d115-4eb7-bc84-9974abcf5064/v2.0/";
    oidcOptions.ClientId = "4ba4de56-9cef-45d9-83fa-a4c18f9f5f0f";
    

    Przykład dla urzędu "common" platformy Microsoft Azure:

    Dla aplikacji wielodostępnych należy używać "wspólnego" urzędu. Możesz również użyć "wspólnego" urzędu dla aplikacji z jedną dzierżawą, ale jest wymagany niestandardowy IssuerValidator , jak pokazano w dalszej części tej sekcji.

    oidcOptions.Authority = "https://login.microsoftonline.com/common/v2.0/";
    
  • ClientSecret: wpis tajny klienta OIDC.

    Poniższy przykład dotyczy tylko celów testowych i demonstracyjnych. Nie przechowuj wpisu tajnego klienta w zestawie aplikacji ani nie sprawdzaj wpisu tajnego w kontroli źródła. Zapisz wpis tajny klienta w wpisach tajnych użytkownika, usłudze Azure Key Vault lub zmiennej środowiskowej.

    Konfiguracja schematu uwierzytelniania jest automatycznie odczytywana z builder.Configuration["Authentication:Schemes:{SCHEME NAME}:{PropertyName}"]elementu , gdzie {SCHEME NAME} symbol zastępczy jest schematem, który jest MicrosoftOidc domyślnie. Ponieważ konfiguracja jest wstępnie skonfigurowana, klucz tajny klienta może być automatycznie odczytywany za pośrednictwem Authentication:Schemes:MicrosoftOidc:ClientSecret klucza konfiguracji. Na serwerze przy użyciu zmiennych środowiskowych nazwij zmienną środowiskową Authentication__Schemes__MicrosoftOidc__ClientSecret:

    set Authentication__Schemes__MicrosoftOidc__ClientSecret={CLIENT SECRET}
    

    Tylko w przypadku demonstracji i testowaniaClientSecret można ustawić bezpośrednio. Nie ustawiaj wartości bezpośrednio dla wdrożonych aplikacji produkcyjnych. W przypadku nieco ulepszonych zabezpieczeń warunkowo skompiluj wiersz z symbolem DEBUG :

    #if DEBUG
    oidcOptions.ClientSecret = "{CLIENT SECRET}";
    #endif
    

    Przykład:

    Klucz tajny klienta (): 463471c8c4...f90d674bc9 ({CLIENT SECRET}skrócony do wyświetlania)

    #if DEBUG
    oidcOptions.ClientSecret = "463471c8c4...137f90d674bc9";
    #endif
    
  • ResponseType: Konfiguruje procedurę obsługi OIDC tak, aby wykonywała tylko przepływ kodu autoryzacji. Niejawne dotacje i przepływy hybrydowe są niepotrzebne w tym trybie.

    W konfiguracji niejawnego udzielania i rejestracji aplikacji przepływów hybrydowych w witrynie Entra lub Witryny Azure Portal nie zaznaczaj pola wyboru dla punktu końcowego autoryzacji w celu zwrócenia tokenów dostępu lub tokenów identyfikatorów. Procedura obsługi OIDC automatycznie żąda odpowiednich tokenów przy użyciu kodu zwróconego z punktu końcowego autoryzacji.

    oidcOptions.ResponseType = OpenIdConnectResponseType.Code;
    
  • MapInboundClaims i konfiguracja NameClaimType i RoleClaimType: Wiele serwerów OIDC używa wartości "name" i "role", a nie wartości domyślnych protokołu SOAP/WS-Fed w systemie ClaimTypes. Gdy MapInboundClaims jest ustawiona wartość false, program obsługi nie wykonuje mapowań oświadczeń, a nazwy oświadczeń z zestawu JWT są używane bezpośrednio przez aplikację. Poniższy przykład ręcznie mapuje oświadczenia nazw i ról:

Uwaga

MapInboundClaims musi być ustawiona na false wartość dla większości dostawców OIDC, co uniemożliwia zmianę nazw oświadczeń.

oidcOptions.MapInboundClaims = false;
oidcOptions.TokenValidationParameters.NameClaimType = JwtRegisteredClaimNames.Name;
oidcOptions.TokenValidationParameters.RoleClaimType = "role";
  • Konfiguracja ścieżki: ścieżki muszą być zgodne z identyfikatorem URI przekierowania (ścieżką wywołania zwrotnego logowania) i ścieżkami przekierowania wylogowania (ścieżki wywołania zwrotnego wylogowywanego) skonfigurowanymi podczas rejestrowania aplikacji u dostawcy OIDC. W witrynie Azure Portal ścieżki są konfigurowane w bloku Uwierzytelnianie rejestracji aplikacji. Zarówno ścieżki logowania, jak i wylogowania muszą być zarejestrowane jako identyfikatory URI przekierowania. Wartości domyślne to /signin-oidc i /signout-callback-oidc.

    • CallbackPath: ścieżka żądania w ścieżce podstawowej aplikacji, w której jest zwracany agent użytkownika.

      W witrynie Entra lub Azure Portal ustaw ścieżkę w identyfikatorze URI przekierowania platformy internetowej:

      https://localhost/signin-oidc

      Uwaga

      Port nie jest wymagany dla localhost adresów.

    • SignedOutCallbackPath: ścieżka żądania w ścieżce podstawowej aplikacji, w której agent użytkownika jest zwracany po wylogowaniu się od dostawcy tożsamości.

      W witrynie Entra lub Azure Portal ustaw ścieżkę w identyfikatorze URI przekierowania platformy internetowej:

      https://localhost/signout-callback-oidc

      Uwaga

      Port nie jest wymagany dla localhost adresów.

      Uwaga

      Jeśli korzystasz z sieci Web firmy Microsoft Identity , dostawca obecnie przekierowuje tylko z powrotem do SignedOutCallbackPath adresu , jeśli microsoftonline.com jest używany urząd (https://login.microsoftonline.com/{TENANT ID}/v2.0/). To ograniczenie nie istnieje, jeśli możesz użyć "wspólnego" urzędu z siecią Microsoft Identity Web. Aby uzyskać więcej informacji, zobacz postLogoutRedirectUri nie działa, gdy adres URL urzędu zawiera identyfikator dzierżawy (AzureAD/microsoft-authentication-library-for-js #5783).

    • RemoteSignOutPath: Żądania odebrane na tej ścieżce powodują, że program obsługi wywołuje wylogowywanie przy użyciu schematu wylogowywanie.

      W witrynie Entra lub Azure Portal ustaw adres URL wylogowywania kanału frontonu:

      https://localhost/signout-oidc

      Uwaga

      Port nie jest wymagany dla localhost adresów.

    oidcOptions.CallbackPath = new PathString("{PATH}");
    oidcOptions.SignedOutCallbackPath = new PathString("{PATH}");
    oidcOptions.RemoteSignOutPath = new PathString("{PATH}");
    

    Przykłady (wartości domyślne):

    oidcOptions.CallbackPath = new PathString("/signin-oidc");
    oidcOptions.SignedOutCallbackPath = new PathString("/signout-callback-oidc");
    oidcOptions.RemoteSignOutPath = new PathString("/signout-oidc");
    
  • (Platforma Microsoft Azure tylko w przypadku "wspólnego" punktu końcowego): TokenValidationParameters.IssuerValidatorwielu dostawców OIDC współpracuje z domyślnym modułem sprawdzania poprawności wystawcy, ale musimy uwzględnić wystawcę sparametryzowanego przy użyciu identyfikatora dzierżawy ({TENANT ID}) zwróconego przez https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration. Aby uzyskać więcej informacji, zobacz SecurityTokenInvalidIssuerException with OpenID Połączenie and the Azure AD "common" endpoint (AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet #1731).

    Tylko w przypadku aplikacji korzystających z identyfikatora Entra firmy Microsoft lub usługi Azure AD B2C z "wspólnym" punktem końcowym:

    var microsoftIssuerValidator = AadIssuerValidator.GetAadIssuerValidator(oidcOptions.Authority);
    oidcOptions.TokenValidationParameters.IssuerValidator = microsoftIssuerValidator.Validate;
    

Przykładowy kod aplikacji

Sprawdź przykładową aplikację pod kątem następujących funkcji:

  • Automatyczne odświeżanie tokenu nieinterakcyjnego przy użyciu niestandardowego cookie modułu odświeżania (CookieOidcRefresher.cs).
  • Klasa PersistingAuthenticationStateProvider (PersistingAuthenticationStateProvider.cs) jest po stronie AuthenticationStateProvider serwera, która używa PersistentComponentState do przepływu stanu uwierzytelniania do klienta, który jest następnie stały przez okres istnienia aplikacji WebAssembly.
  • Żądania do Blazor aplikacji internetowej są kierowane do projektu internetowego interfejsu API zaplecza (MinimalApiJwt). MapForwarderProgram w pliku dodaje bezpośrednie przekazywanie żądań HTTP, które pasują do określonego wzorca do określonego miejsca docelowego przy użyciu domyślnej konfiguracji dla żądania wychodzącego, dostosowanych przekształceń i domyślnego klienta HTTP:
    • Podczas renderowania Weather składnika na serwerze składnik używa ServerWeatherForecaster elementu do obsługi serwera proxy żądania danych pogodowych przy użyciu tokenu dostępu użytkownika.
    • Gdy składnik jest renderowany na kliencie, składnik używa ClientWeatherForecaster implementacji usługi, która używa wstępnie skonfigurowanego HttpClient (w pliku projektu Program klienta) do wywołania internetowego interfejsu API do projektu serwera. Minimalny punkt końcowy interfejsu API (/weather-forecast) zdefiniowany w pliku projektu Program serwera przekształca żądanie przy użyciu tokenu dostępu użytkownika w celu uzyskania danych pogodowych.

Aby uzyskać więcej informacji na temat wywołań interfejsu API sieci Web przy użyciu abstrakcji usługi w Blazor usłudze Web Apps, zobacz Wywoływanie internetowego interfejsu API z aplikacji ASP.NET CoreBlazor.

Projekt aplikacji internetowej po stronie Blazor klienta (BlazorWebAppOidc.Client)

Projekt BlazorWebAppOidc.Client jest projektem Blazor po stronie klienta aplikacji internetowej.

Klasa PersistentAuthenticationStateProvider (PersistentAuthenticationStateProvider.cs) to po stronie AuthenticationStateProvider klienta, która określa stan uwierzytelniania użytkownika, wyszukując dane utrwalone na stronie podczas renderowania na serwerze. Stan uwierzytelniania jest stały dla okresu istnienia aplikacji WebAssembly.

Jeśli użytkownik musi się zalogować lub wylogować, wymagane jest ponowne załadowanie pełnej strony.

Przykładowa aplikacja udostępnia tylko nazwę użytkownika i adres e-mail do celów wyświetlania. Nie obejmuje tokenów uwierzytelniających się na serwerze podczas podejmowania kolejnych żądań, które działają oddzielnie przy użyciu elementu cookie uwzględnionego w HttpClient żądaniach do serwera.

Projekt internetowego interfejsu API zaplecza (MinimalApiJwt)

Projekt MinimalApiJwt jest internetowym interfejsem API zaplecza dla wielu projektów frontonu. Projekt konfiguruje minimalny punkt końcowy interfejsu API dla danych pogodowych. Żądania z Blazor projektu po stronie serwera aplikacji internetowej (BlazorWebAppOidc) są kierowane do MinimalApiJwt projektu.

Konfigurowanie

Skonfiguruj projekt w JwtBearerOptions wywołaniu AddJwtBearer w pliku projektu Program :

  • Audience: ustawia grupę odbiorców dla dowolnego odebranego tokenu openID Połączenie.

    W witrynie Azure lub Entra Portal: dopasuj wartość do ścieżki identyfikatora URI identyfikatora aplikacji skonfigurowanego podczas dodawania Weather.Get zakresu w obszarze Uwidacznij interfejs API:

    jwtOptions.Audience = "{APP ID URI}";
    

    Przykład:

    Identyfikator URI identyfikatora aplikacji ({APP ID URI}): : https://{DIRECTORY NAME}.onmicrosoft.com/{CLIENT ID}

    • Nazwa katalogu ({DIRECTORY NAME}): contoso
    • Identyfikator aplikacji (klienta) ({CLIENT ID}): 4ba4de56-9cef-45d9-83fa-a4c18f9f5f0f
    jwtOptions.Audience = "https://contoso.onmicrosoft.com/4ba4de56-9cef-45d9-83fa-a4c18f9f5f0f";
    

    Powyższy przykład dotyczy aplikacji zarejestrowanej w dzierżawie z typem dzierżawy usługi AAD B2C. Jeśli aplikacja jest zarejestrowana w dzierżawie ME-ID, identyfikator URI identyfikatora aplikacji jest inny, w związku z czym odbiorcy są różni.

    Przykład:

    Identyfikator URI identyfikatora aplikacji ({APP ID URI}): api://{CLIENT ID} z identyfikatorem aplikacji (klient) ({CLIENT ID}): 4ba4de56-9cef-45d9-83fa-a4c18f9f5f0f

    jwtOptions.Audience = "api://4ba4de56-9cef-45d9-83fa-a4c18f9f5f0f";
    
  • Authority: Ustawia urząd do wykonywania wywołań openID Połączenie. Dopasuj wartość do urzędu skonfigurowanego dla programu obsługi OIDC w programie BlazorWebAppOidc/Program.cs:

    jwtOptions.Authority = "{AUTHORITY}";
    

    Przykład:

    Urząd (): https://login.microsoftonline.com/a3942615-d115-4eb7-bc84-9974abcf5064/v2.0/ ({AUTHORITY}używa identyfikatora a3942615-d115-4eb7-bc84-9974abcf5064dzierżawy )

    jwtOptions.Authority = "https://login.microsoftonline.com/a3942615-d115-4eb7-bc84-9974abcf5064/v2.0/";
    

    Powyższy przykład dotyczy aplikacji zarejestrowanej w dzierżawie z typem dzierżawy usługi AAD B2C. Jeśli aplikacja jest zarejestrowana w dzierżawie ME-ID, urząd powinien być zgodny z parametrem issurer (iss) JWT zwróconym przez dostawcę tożsamości:

    jwtOptions.Authority = "https://sts.windows.net/a3942615-d115-4eb7-bc84-9974abcf5064/";
    

Minimalny interfejs API dla danych pogodowych

Zabezpieczanie punktu końcowego danych prognozy pogody w pliku projektu Program :

app.MapGet("/weather-forecast", () =>
{
    var forecast = Enumerable.Range(1, 5).Select(index =>
        new WeatherForecast
        (
            DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
            Random.Shared.Next(-20, 55),
            summaries[Random.Shared.Next(summaries.Length)]
        ))
        .ToArray();
    return forecast;
}).RequireAuthorization();

Metoda RequireAuthorization rozszerzenia wymaga autoryzacji dla definicji trasy. W przypadku wszystkich kontrolerów dodanych do projektu dodaj [Authorize] atrybut do kontrolera lub akcji.

Przekieruj do strony głównej podczas logowania

Gdy użytkownik przechodzi po aplikacji, LogInOrOut składnik (Layout/LogInOrOut.razor) ustawia ukryte pole dla zwracanego adresu URL (ReturnUrl) na wartość bieżącego adresu URL (currentURL). Gdy użytkownik wyloguje się z aplikacji, dostawca tożsamości zwraca je do strony, z której się wylogował.

Jeśli użytkownik wyloguje się z bezpiecznej strony, zostanie zwrócony z powrotem do tej samej bezpiecznej strony po wylogowaniu się tylko do wysłania z powrotem za pośrednictwem procesu uwierzytelniania. To zachowanie jest w porządku, gdy użytkownicy muszą często przełączać konta. Jednak alternatywna specyfikacja aplikacji może wywołać zwrócenie użytkownika do strony głównej aplikacji lub innej strony po wylogowaniu. W poniższym przykładzie pokazano, jak ustawić stronę główną aplikacji jako zwrotny adres URL operacji wylogowywania.

Ważne zmiany w składniku LogInOrOut przedstawiono w poniższym przykładzie. Pole value ukryte dla ReturnUrl elementu jest ustawione na stronę główną pod adresem /. IDisposable program nie jest już implementowany. Lek NavigationManager nie jest już wstrzykiwany. Cały @code blok zostanie usunięty.

Layout/LogInOrOut.razor:

@using Microsoft.AspNetCore.Authorization

<div class="nav-item px-3">
    <AuthorizeView>
        <Authorized>
            <form action="authentication/logout" method="post">
                <AntiforgeryToken />
                <input type="hidden" name="ReturnUrl" value="/" />
                <button type="submit" class="nav-link">
                    <span class="bi bi-arrow-bar-left-nav-menu" aria-hidden="true">
                    </span> Logout @context.User.Identity?.Name
                </button>
            </form>
        </Authorized>
        <NotAuthorized>
            <a class="nav-link" href="authentication/login">
                <span class="bi bi-person-badge-nav-menu" aria-hidden="true"></span> 
                Login
            </a>
        </NotAuthorized>
    </AuthorizeView>
</div>

Kryptograficzne spoza

Nonce to wartość ciągu, która kojarzy sesję klienta z tokenem identyfikatora w celu wyeliminowania ataków powtarzania.

Jeśli podczas opracowywania i testowania uwierzytelniania wystąpi błąd inny niż błąd, użyj nowej sesji przeglądarki InPrivate/incognito dla każdego przebiegu testu, bez względu na to, jak mała zmiana wprowadzona w aplikacji lub użytkowniku testowym, ponieważ nieaktualne cookie dane mogą prowadzić do błędu nieocenego. Aby uzyskać więcej informacji, zobacz sekcję Cookies and site data (Dane lokacji i lokacji).

Wartość nie jest wymagana lub używana, gdy token odświeżania jest wymieniany na potrzeby nowego tokenu dostępu. W przykładowej aplikacji CookieOidcRefresher element (CookieOidcRefresher.cs) celowo ustawia wartość OpenIdConnectProtocolValidator.RequireNoncefalse.

Rozwiązywanie problemów

Rejestrowanie

Aplikacja serwera jest standardową aplikacją ASP.NET Core. Zobacz wskazówki dotyczące rejestrowania ASP.NET Core, aby włączyć niższy poziom rejestrowania w aplikacji serwera.

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

    Pokrycie konfiguracji w tym artykule przedstawia przykłady prawidłowej konfiguracji. Dokładnie sprawdź konfigurację wyszukując 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:

    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 ma charakter poufny lub opisuje potencjalną lukę w zabezpieczeniach produktu, którą mogą wykorzystać osoby atakujące, 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.

Cookies i dane lokacji

Cookiedane s i lokacji 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:

  • Logowanie cookieużytkownika
  • Aplikacje cookie
  • Buforowane i przechowywane dane lokacji

Jednym z podejść do zapobiegania utrzymującym cookiesię danym lokacji i testowaniu jest:

  • 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}zastępczego , gdzie symbol zastępczy {URL} to adres URL do otwarcia (na przykład https://localhost:5001).
      • Mozilla Firefox: użyj symbolu -private -url {URL}zastępczego , gdzie symbol zastępczy {URL} 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.

Uruchamianie aplikacji serwera

Podczas testowania i rozwiązywania problemów z Blazor aplikacją internetową upewnij się, że używasz aplikacji z projektu serwera.

Sprawdzanie użytkownika

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

UserClaims.razor:

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

<PageTitle>User Claims</PageTitle>

<h1>User Claims</h1>

@if (claims.Count() > 0)
{
    <ul>
        @foreach (var claim in claims)
        {
            <li><b>@claim.Type:</b> @claim.Value</li>
        }
    </ul>
}

@code {
    private IEnumerable<Claim> claims = Enumerable.Empty<Claim>();

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

    protected override async Task OnInitializedAsync()
    {
        if (AuthState == null)
        {
            return;
        }

        var authState = await AuthState;
        claims = authState.User.Claims;
    }
}

Dodatkowe zasoby