Megosztás a következőn keresztül:


ASP.NET Core Blazor Web App védelme az OpenID Connect (OIDC) használatával

Note

Ez nem a cikk legújabb verziója. Az aktuális kiadásról a cikk .NET 10-es verziójában olvashat.

Ez a cikk azt ismerteti, hogyan lehet biztonságossá tenni az Blazor Web AppOpenID Connectet (OIDC) egy mintaalkalmazás használatával a dotnet/blazor-samples GitHub-adattárban (.NET 8 vagy újabb verzió) (letöltés).

A Microsoft Entra ID vagy az Azure AD B2C esetében a AddMicrosoftIdentityWebApp (Identity, API-dokumentáció) használhatóMicrosoft.Identity.Web, amely az OIDC-t és a hitelesítési kezelőket is hozzáadja a megfelelő alapértelmezett értékekkel. A jelen cikkben szereplő mintaalkalmazás és útmutató nem használja a Microsoft Identity Web alkalmazást. Az útmutató bemutatja, hogyan konfigurálhatja az OIDC kezelőt manuálisan bármely OIDC-szolgáltatóhoz. A Microsoft Identity Web implementálásával kapcsolatos további információkért lásd: Blazor Web App.

A cikk jelen verziója az OIDC bevezetését tárgyalja anélkül, hogy alkalmazná a Backend for Frontend (BFF) mintát, egy olyan alkalmazás keretében, amely globális interaktív automatikus renderelést (kiszolgálót és .Client projekteket) fogad el. A BFF-minta a külső szolgáltatásokra irányuló hitelesített kérések készítéséhez hasznos. Módosítsa a cikk verzióválasztóját BFF-mintára , ha az alkalmazás specifikációja kéri a BFF-minta bevezetését.

A következő specifikációt fogadjuk el:

  • Az Blazor Web Appautomatikus renderelési módot használja globális interaktivitással.
  • A kiszolgáló és az ügyfélalkalmazások egyéni hitelesítési állapotszolgáltatói szolgáltatásokat használnak a felhasználó hitelesítési állapotának rögzítéséhez és a kiszolgáló és az ügyfél közötti forgalomhoz.
  • Ez az alkalmazás minden OIDC-hitelesítési folyamat kiindulópontja. Az OIDC manuálisan van konfigurálva az alkalmazásban, és nem támaszkodik a Microsoft Entra-azonosítóra vagy a Microsoft Identity Web-csomagokra , és a mintaalkalmazáshoz sem szükséges a Microsoft Azure üzemeltetése. A mintaalkalmazás azonban használható az Entra, a Microsoft Identity Web és az Azure-ban is.
  • Automatikus, nem interaktív tokenfrissítés.
  • Egy külön webes API-projekt egy biztonságos webes API-hívást mutat be az időjárási adatokhoz.

A Microsoft Authentication Library for .NET, Microsoft Identity Web és Microsoft Entra ID használatával kapcsolatos alternatív élményért tekintse meg a Microsoft Entra ID-val történő ASP.NET Core Blazor Web App biztonságossá tételét.

Mintamegoldás

A mintaalkalmazás a következő projektekből áll:

  • BlazorWebAppOidc: A kiszolgálóoldali Blazor Web Appprojekt, amely egy minimális API-végpontot tartalmaz az időjárási adatokhoz.
  • BlazorWebAppOidc.Client: A Blazor Web Appügyféloldali projektje.
  • MinimalApiJwt: Háttérbeli webes API minimális API-végponttal az időjárási adatokhoz.

A mintát a Blazor mintatár legújabb verziómappájában érheti el az alábbi hivatkozással. A minta a .NET 8 vagy újabb verzió BlazorWebAppOidc mappájában található.

Indítsa el a megoldást a Aspire/Aspire.AppHost projektből.

Mintakód megtekintése vagy letöltése (letöltés)

Mintamegoldás-funkciók:

  • Automatikus, nem interaktív tokenfrissítés egyéni cookie frissítő (CookieOidcRefresher.cs) segítségével.

  • Az időjárási adatokat egy minimális API-végpont (/weather-forecast) kezeli a ProgramProgram.cs projekt fájljában (MinimalApiJwt). A végpont a RequireAuthorizationmeghívásával igényel engedélyezést. A projekthez hozzáadott vezérlők esetében adja hozzá az [Authorize] attribútumot a vezérlőhöz vagy a művelethez. Az alkalmazás teljes körű engedélyezésének megköveteléséről az engedélyezési szabályzat révén, valamint a nyilvános végpontok egy részének engedélyezés alól történő kivételéről további információt a Razor Pages OIDC útmutatójában talál.

  • Az alkalmazás biztonságosan meghív egy webes API-t az időjárási adatokhoz:

    • Amikor a Weather összetevőt a kiszolgálón renderelik, az összetevő a ServerWeatherForecaster-t használja a kiszolgálón, hogy időjárási adatokat szerezzen a MinimalApiJwt projekt webes API-jából egy DelegatingHandler (TokenHandler) segítségével, amely a HttpContext hozzáférési jogkivonatát csatolja a kérelemhez.
    • Amikor az összetevő megjelenik az ügyfélen, az összetevő a ClientWeatherForecaster szolgáltatás implementációját használja, amely egy előre konfigurált HttpClient (az ügyfélprojekt fájljában Program ) használatával kezdeményezi a webes API-hívást a kiszolgálóprojektből ServerWeatherForecaster.
  • A kiszolgálóprojekt meghívja AddAuthenticationStateSerialization, hogy adjon hozzá egy kiszolgálóoldali hitelesítési állapotszolgáltatót, amely PersistentComponentState használ a hitelesítési állapot ügyfélhez való áramlásához. Az ügyfél meghívja AddAuthenticationStateDeserialization, hogy deszerializálja és használja a kiszolgáló által átadott hitelesítési állapotot. A hitelesítési állapot a WebAssembly-alkalmazás élettartamára van rögzítve.
  • A PersistingAuthenticationStateProvider osztály (PersistingAuthenticationStateProvider.cs) egy kiszolgálóoldali AuthenticationStateProvider, amely PersistentComponentState használ a hitelesítési állapotnak az ügyfélhez való áramlásához, amelyet a WebAssembly-alkalmazás élettartama során rögzítettek.

A (webes) API-hívásokról, amelyek szolgáltatás absztrakcióit használják s-ben, azcímű ASP.NET Core -alkalmazásból történő webes API meghívása témakörben olvashat.

OIDC-szolgáltató terminológiája és útmutatója

Bár nem szükséges a Microsoft Entra (ME-ID) használata OIDC-szolgáltatóként a mintaalkalmazás használatához és a jelen cikk útmutatása, ez a cikk a Microsoft dokumentációjában és az Azure/Entra portálokon található nevek használatával ME-ID beállításait ismerteti. Az OIDC-beállítások elnevezése hasonló az OIDC-szolgáltatók között. Külső OIDC-szolgáltató használata esetén használja a szolgáltató dokumentációját az alkalmazás- és webes API-regisztrációkra vonatkozó jelen cikkben található útmutatással együtt.

Microsoft Entra ID-alkalmazásregisztrációk

Azt javasoljuk, hogy külön regisztrációkat használjunk alkalmazásokhoz és webes API-khoz, még akkor is, ha az alkalmazások és a webes API-k ugyanabban a megoldásban vannak. Az alábbi útmutató a BlazorWebAppOidc mintamegoldás alkalmazás- és MinimalApiJwt webes API-jára vonatkozik, de ugyanez az útmutató általában az alkalmazások és webes API-k Entra-alapú regisztrációira vonatkozik.

Az alkalmazás- és webes API-regisztrációval kapcsolatos útmutatásért lásd : Alkalmazás regisztrálása a Microsoft Entra-azonosítóban.

Először regisztrálja a webes API-t (MinimalApiJwt), hogy aztán hozzáférést biztosítson a webes API-hoz az alkalmazás regisztrálásakor. A webes API bérlőazonosítója és ügyfél-azonosítója az API saját Program fájljában kerül konfigurálásra. A webes API regisztrálása után tegye elérhetővé a webes API-t az Alkalmazásregisztrációk>API exponálása szakaszában egy hatókör nevével Weather.Get. Jegyezze fel az alkalmazásazonosító URI-ját az alkalmazás konfigurációjában való használatra.

Ezután regisztrálja az alkalmazást (BlazorWebAppOidc/BlazorWebApOidc.Client) egy webplatform-konfigurációval és egy átirányítási URI-val (nincs szükség portra).https://localhost/signin-oidc Az alkalmazás bérlőazonosítóját és ügyfél-azonosítóját, valamint a webes API alapcímét, az alkalmazásazonosító URI-ját és az időjárás-hatókör nevét használja az alkalmazás konfigurálásához a fájlban Program . Adjon api-engedélyt a webes API eléréséhez az Alkalmazásregisztrációk>. Ha az alkalmazás biztonsági specifikációja kéri, rendszergazdai hozzájárulást adhat a szervezetnek a webes API eléréséhez. A jogosult felhasználók és csoportok hozzá vannak rendelve az alkalmazás regisztrációihoz az Alkalmazásregisztrációk>Nagyvállalati alkalmazások szakaszban.

Az Entra vagy az Azure Portal implicit engedélyezési és hibrid folyamatok alkalmazásregisztrációs konfigurációjában ne jelölje be az engedélyezési végpont egyik jelölőnégyzetét sem az Access-jogkivonatok vagy az azonosító jogkivonatok visszaadásához. Az OpenID Connect kezelője automatikusan kéri a megfelelő tokeneket az engedélyezési végponttól a visszaadott kód segítségével.

Hozzon létre egy ügyféltitkot az alkalmazás regisztrációjában az Entra vagy az Azure portálon (Kezelés>Tanúsítványok és titkok>Új ügyféltitok). Őrizze meg az ügyfél titkos értékét a következő szakasz használatához.

A cikk későbbi részében további Entra-konfigurációs útmutatást talál az egyes beállításokhoz.

Az ügyfél titkos kódjának létrehozása

Ez a szakasz csak a Blazor Web App (BlazorWebAppOidc projekt) kiszolgálóprojektre vonatkozik.

Warning

Ne tárolja az alkalmazás titkos kulcsait, kapcsolati sztringeket, hitelesítő adatokat, jelszavakat, személyes azonosítószámokat (PIN-eket), titkos C#/.NET-kódot vagy titkos kulcsokat/jogkivonatokat az ügyféloldali kódban, ami mindig nem biztonságos. Tesztelési/előkészítési és éles környezetekben a kiszolgálóoldali Blazor kód- és webes API-knak biztonságos hitelesítési folyamatokat kell használniuk, amelyek nem őrzik meg a hitelesítő adatokat a projektkódban vagy a konfigurációs fájlokban. A helyi fejlesztési tesztelésen kívül javasoljuk, hogy kerülje a környezeti változók bizalmas adatok tárolására való használatát, mivel a környezeti változók nem a legbiztonságosabb megközelítések. A helyi fejlesztési teszteléshez a Titkos kulcskezelő eszköz ajánlott a bizalmas adatok védelméhez. További információ: Bizalmas adatok és hitelesítő adatok biztonságos karbantartása.

A helyi fejlesztési teszteléshez használja a Secret Manager eszközt a Blazor kiszolgálóprojekt ügyféltitkának tárolására a konfigurációs kulcs Authentication:Schemes:MicrosoftOidc:ClientSecretalatt.

A Blazor kiszolgálóprojekt nincs inicializálva a Secret Manager eszközhöz. A következő parancs végrehajtásához használjon egy parancshéjat, például a Visual Studióban a Developer PowerShell parancshéjat. A parancs végrehajtása előtt módosítsa a könyvtárat a cd paranccsal a kiszolgálóprojekt könyvtárára. A parancs létrehoz egy felhasználói titkos kód azonosítót (<UserSecretsId> a kiszolgálóalkalmazás projektfájljában):

dotnet user-secrets init

Hajtsa végre a következő parancsot az ügyfél titkos kódjának beállításához. A {SECRET} helyőrző az alkalmazás regisztrációjából beszerzett ügyfélkód:

dotnet user-secrets set "Authentication:Schemes:MicrosoftOidc:ClientSecret" "{SECRET}"

A Visual Studio használata esetén a titkos kód beállításának megerősítéséhez kattintson a jobb gombbal a kiszolgálóprojektre a Megoldáskezelőben , és válassza a Felhasználói titkos kódok kezelése lehetőséget.

MinimalApiJwt projekt

A MinimalApiJwt projekt egy háttérbeli webes API több előtérbeli projekthez. A projekt minimális API-végpontot konfigurál az időjárási adatokhoz.

A MinimalApiJwt.http fájl használható az időjárási adatkérés teszteléséhez. Vegye figyelembe, hogy a végpont teszteléséhez a MinimalApiJwt projektnek futnia kell, a végpont pedig a fájlba van kódolva. További információ: .http-fájlok használata a Visual Studio 2022-ben.

A projekt csomagokat és konfigurációt tartalmaz OpenAPI-dokumentumok létrehozásához.

A projekt tartalmazza az OpenAPI-dokumentumok és a Swagger felhasználói felület fejlesztési környezetben való előállításához szükséges csomagokat és konfigurációkat. További információ: A létrehozott OpenAPI-dokumentumok használata.

A projekt létrehoz egy minimális API-végpontot az időjárási adatokhoz:

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();

Állítsa be a projektet a projekt JwtBearerOptions fájljában található AddJwtBearer hívás Program részénél.

A Authority szolgáltató beállítja az OIDC-hívások indítását. Javasoljuk, hogy a projekthez külön alkalmazásregisztrációt MinimalApiJwt használjon. A hatóság megegyezik az identitásszolgáltató által visszaadott JWT kibocsátójával (iss).

jwtOptions.Authority = "{AUTHORITY}";

A Hatóság formátuma a használatban lévő bérlő típusától függ. Az alábbi példák a Microsoft Entra-azonosítóhoz a következő bérlőazonosítót aaaabbbb-0000-cccc-1111-dddd2222eeeehasználják: .

példa ME-ID bérlői hatóságra:

jwtOptions.Authority = "https://sts.windows.net/aaaabbbb-0000-cccc-1111-dddd2222eeee";

Példa az AAD B2C bérlői szolgáltatóra:

jwtOptions.Authority = "https://login.microsoftonline.com/aaaabbbb-0000-cccc-1111-dddd2222eeee/v2.0";

A Audience kapott OIDC-jogkivonat célközönségét állítja be.

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

Note

A Microsoft Entra ID használatakor az értéknek csak az Alkalmazásazonosító URI elérési útjára kell illeszkednie, amely a Weather.Get beállításaiban van konfigurálva, amikor hozzáadja a hatókört az Entra vagy az Azure portálon. Az értékben ne adja meg a "Weather.Get" hatókör nevét.

A célközönség formátuma a használatban lévő bérlő típusától függ. A Microsoft Entra-azonosítóhoz az alábbi példák a bérlőazonosítót contoso és a következő ügyfél-azonosítót használják 11112222-bbbb-3333-cccc-4444dddd5555: .

példa ME-ID bérlői alkalmazásazonosító URI-jére:

jwtOptions.Audience = "api://11112222-bbbb-3333-cccc-4444dddd5555";

Példa az AAD B2C-bérlő alkalmazásazonosító URI-jére:

jwtOptions.Audience = "https://contoso.onmicrosoft.com/11112222-bbbb-3333-cccc-4444dddd5555";

Blazor Web App kiszolgálóprojekt (BlazorWebAppOidc)

A BlazorWebAppOidc projekt a Blazor Web Appkiszolgálóoldali projektje.

A DelegatingHandler (TokenHandler) kezeli a felhasználó hozzáférési jogkivonatának kimenő kérelmekhez való csatolását. A jogkivonat-kezelő csak statikus kiszolgálóoldali renderelés (statikus SSR) során fut, így a HttpContext használata ebben a forgatókönyvben biztonságos. További információ: IHttpContextAccessor/HttpContext ASP.NET Core-alkalmazásokbanBlazor, valamint ASP.NET Core-kiszolgálóoldali és Blazor Web App további biztonsági forgatókönyvekben.

TokenHandler.cs:

public class TokenHandler(IHttpContextAccessor httpContextAccessor) : 
    DelegatingHandler
{
    protected override async Task<HttpResponseMessage> SendAsync(
        HttpRequestMessage request, CancellationToken cancellationToken)
    {
        if (httpContextAccessor.HttpContext is null)
        {
            throw new Exception("HttpContext not available");
        }

        var accessToken = await httpContextAccessor.HttpContext
            .GetTokenAsync("access_token");

        request.Headers.Authorization =
            new AuthenticationHeaderValue("Bearer", accessToken);

        return await base.SendAsync(request, cancellationToken);
    }
}

A projekt Program fájljában a jogkivonat-kezelő (TokenHandler) szolgáltatásként regisztrálva van, és üzenetkezelőként megadva, amellyel a háttér AddHttpMessageHandler webes API-hoz biztonságos kéréseket lehet küldeni MinimalApiJwt, egy elnevezett HTTP-ügyfél ("ExternalApi") használatával.

builder.Services.AddScoped<TokenHandler>();

builder.Services.AddHttpClient("ExternalApi",
      client => client.BaseAddress = new Uri(builder.Configuration["ExternalApiUri"] ?? 
          throw new Exception("Missing base address!")))
      .AddHttpMessageHandler<TokenHandler>();

A projekt fájljában appsettings.json konfigurálja a külső API URI-t:

"ExternalApiUri": "{BASE ADDRESS}"

Example:

"ExternalApiUri": "https://localhost:7277"

A következő OpenIdConnectOptions konfiguráció található a projekt Program fájljában a AddOpenIdConnecthívásához:

PushedAuthorizationBehavior: A leküldéses engedélyezési kérelmek (PAR) támogatását szabályozza. Alapértelmezés szerint a PAR használata, ha az identitásszolgáltató felderítési dokumentuma (általában itt .well-known/openid-configurationtalálható) a PAR támogatását hirdeti. Ha PAR-támogatást szeretne igényelni az alkalmazáshoz, hozzárendelhet egy értéket PushedAuthorizationBehavior.Require. A PAR-t a Microsoft Entra nem támogatja, és az Entra nem tervezi, hogy a jövőben is támogatni tudja.

oidcOptions.PushedAuthorizationBehavior = PushedAuthorizationBehavior.UseIfAvailable;

SignInScheme: Beállítja a felhasználó identitásának sikeres hitelesítés utáni megőrzéséért felelős köztes szoftvernek megfelelő hitelesítési sémát. Az OIDC-kezelőnek olyan bejelentkezési sémát kell használnia, amely képes a felhasználói hitelesítő adatok megőrzésére a kérések között. A következő sor csupán szemléltetés céljából jelenik meg. Ha nincs megadva, a DefaultSignInScheme tartalék értékként használja a rendszer.

oidcOptions.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;

A openid és profile (Scope) hatókörei (nem kötelező): A openid és profile hatókörök alapértelmezés szerint azért is vannak konfigurálva, mert az OIDC-kezelő működéséhez szükségesek, de előfordulhat, hogy újra hozzá kell adni őket, ha a hatókörök szerepelnek a Authentication:Schemes:MicrosoftOidc:Scope konfigurációban. Általános konfigurációs útmutatásért tekintse meg ASP.NET Core és ASP.NET Core Blazor konfigurációjának konfigurációját.

oidcOptions.Scope.Add(OpenIdConnectScope.OpenIdProfile);

SaveTokens: Meghatározza, hogy a hozzáférési és frissítési jogkivonatokat a sikeres engedélyezés után a AuthenticationProperties kell-e tárolni. Ez a tulajdonság true-ra van beállítva, így a frissítési jogkivonatot nem interaktív frissítéshez tárolják.

oidcOptions.SaveTokens = true;

Offline elérés hatóköre (Scope): A frissítési jogkivonathoz a offline_access hatókör szükséges.

oidcOptions.Scope.Add(OpenIdConnectScope.OfflineAccess);

Authority és ClientId: Beállítja az OIDC-hívások szolgáltatói és ügyfél-azonosítóját.

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

Az alábbi példa a következő bérlőazonosítót aaaabbbb-0000-cccc-1111-dddd2222eeee és ügyfél-azonosítót 00001111-aaaa-2222-bbbb-3333cccc4444használja:

oidcOptions.Authority = "https://login.microsoftonline.com/aaaabbbb-0000-cccc-1111-dddd2222eeee/v2.0";
oidcOptions.ClientId = "00001111-aaaa-2222-bbbb-3333cccc4444";

Több-bérlős alkalmazások esetén a "common" szolgáltatót kell használni. Használhatja a "közös" hatóságot az egybérlős alkalmazásokhoz, de egy egyéni IssuerValidator szükséges, ahogyan később a jelen szakaszban megmutatjuk.

oidcOptions.Authority = "https://login.microsoftonline.com/common/v2.0";

ResponseType: Az OIDC-kezelőt úgy konfigurálja, hogy csak engedélyezési kódfolyamatot hajt végre. Ebben a módban az implicit támogatások és a hibrid folyamatok szükségtelenek. Az OIDC kezelő automatikusan kéri a megfelelő tokeneket az engedélyezési végponttól visszaadott kód használatával.

oidcOptions.ResponseType = OpenIdConnectResponseType.Code;

MapInboundClaims, valamint a NameClaimType és RoleClaimTypekonfigurációja: Sok OIDC-kiszolgáló a "name" és "role" értékeket használja a SOAP/WS-Fed alapértelmezések helyett ClaimTypes-ban. Ha MapInboundClaimsfalseértékre van állítva, a kezelő nem végez jogcímleképezéseket, és a JWT-ből származó jogcímneveket az alkalmazás közvetlenül használja. Az alábbi példa a szerepkör jogcímtípusát a "roles" értékre állítja, amely a Microsoft Entra ID (ME-ID) számára megfelelő. További információért tekintse meg az identitásszolgáltató dokumentációját.

Note

MapInboundClaims-t a legtöbb OIDC-szolgáltatónál false-re kell beállítani, ami megakadályozza az állítások átnevezését.

oidcOptions.MapInboundClaims = false;
oidcOptions.TokenValidationParameters.NameClaimType = "name";
oidcOptions.TokenValidationParameters.RoleClaimType = "roles";

Elérési út konfigurációja: Az elérési utaknak meg kell egyeznie az átirányítási URI-nak (bejelentkezési visszahívási útvonal) és a kijelentkezés utáni átirányítási (kijelentkezési visszahívási útvonal) elérési útnak, amelyet az alkalmazás OIDC-szolgáltatónál való regisztrálásakor konfiguráltak. Az Azure Portalon az útvonalak az alkalmazás regisztrációjának Hitelesítési paneljén vannak konfigurálva. A bejelentkezési és a bejelentkezési útvonalakat átirányítási URI-kként kell regisztrálni. Az alapértelmezett értékek /signin-oidc és /signout-callback-oidc.

CallbackPath: Az alkalmazás alapútvonalán belüli kérelem elérési útja, ahol a user-agent visszaadódik.

Konfigurálja a kijelentkezett visszahívási útvonalat az alkalmazás OIDC-szolgáltatói regisztrációjában. Az alábbi példában a {PORT} helyőrző az alkalmazás portja:

https://localhost:{PORT}/signin-oidc

Note

A Microsoft Entra ID használatakor nincs szükség portra localhost címekhez. A legtöbb más OIDC-szolgáltatónak a megfelelő portra van szüksége.

SignedOutCallbackPath (konfigurációs kulcs: "SignedOutCallbackPath"): Az alkalmazás alapútvonalán belüli kérelem útvonala, amelyet az OIDC kezelője fog el, ahol a felhasználói ügynök először visszatér, miután kijelentkezett az identitásszolgáltatóból. A mintaalkalmazás nem állít be értéket az elérési úthoz, mert a rendszer a "/signout-callback-oidc" alapértelmezett értékét használja. A kérés elfogása után az OIDC kezelője a SignedOutRedirectUri vagy RedirectUrihelyére irányít át, ha meg vannak adva.

Konfigurálja a kijelentkezett visszahívási útvonalat az alkalmazás OIDC-szolgáltatói regisztrációjában. Az alábbi példában a {PORT} helyőrző az alkalmazás portja:

https://localhost:{PORT}/signout-callback-oidc

Note

A Microsoft Entra ID használatakor állítsa be az elérési utat a webplatform-konfiguráció Átirányítási URI bejegyzéseiben az Entra vagy az Azure Portalon. Az Entra használatakor nincs szükség portra localhost címekhez. A legtöbb más OIDC-szolgáltatónak a megfelelő portra van szüksége. Ha nem adja hozzá a kijelentkezett visszahívási útvonal URI-ját az alkalmazás Entra-regisztrációjához, az Entra megtagadja a felhasználó visszairányítását az alkalmazáshoz, és csupán arra kéri őket, hogy zárják be a böngészőablakot.

RemoteSignOutPath: Az ezen az útvonalon fogadott kérések miatt a kezelő meghívja a kijelentkezést a kijelentkezés sémája használatával.

Az alábbi példában a {PORT} helyőrző az alkalmazás portja:

https://localhost/signout-oidc

Note

A Microsoft Entra ID használatakor állítsa be az előtérbeli bejelentkezési URL-címet az Entra vagy az Azure Portalon. Az Entra használatakor nincs szükség portra localhost címekhez. A legtöbb más OIDC-szolgáltatónak a megfelelő portra van szüksége.

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

Példák (alapértelmezett értékek):

oidcOptions.CallbackPath = new PathString("/signin-oidc");
oidcOptions.SignedOutCallbackPath = new PathString("/signout-callback-oidc");
oidcOptions.RemoteSignOutPath = new PathString("/signout-oidc");

(Microsoft Azure csak a "közös" végponttal)TokenValidationParameters.IssuerValidator: Sok OIDC-szolgáltató használja az alapértelmezett kiállítói érvényesítőt, de figyelembe kell vennünk a {TENANT ID} által visszaadott Bérlőazonosítóval (https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration) paraméterezett kiállítót. További információkért lásd: SecurityTokenInvalidIssuerException az OpenID Connect és az Azure AD "common" végpont használatával (AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet #1731).

Kizárólag a "közös" végponttal rendelkező Microsoft Entra ID-t vagy Azure AD B2C-t használó alkalmazások esetén:

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

Blazor Web App ügyfélprojekt (BlazorWebAppOidc.Client)

A BlazorWebAppOidc.Client projekt a Blazor Web Appügyféloldali projektje.

Az ügyfél meghívja AddAuthenticationStateDeserialization, hogy deszerializálja és használja a kiszolgáló által átadott hitelesítési állapotot. A hitelesítési állapot a WebAssembly-alkalmazás élettartamára van rögzítve.

A PersistentAuthenticationStateProvider osztály (PersistentAuthenticationStateProvider.cs) egy ügyféloldali AuthenticationStateProvider, amely meghatározza a felhasználó hitelesítési állapotát a kiszolgálón való megjelenítéskor a lapon tárolt adatok keresése révén. A hitelesítési állapot a WebAssembly-alkalmazás élettartamára van rögzítve.

Ha a felhasználónak be kell jelentkeznie vagy ki kell jelentkeznie, egy teljes oldal újrabetöltésére van szükség.

A mintaalkalmazás csak megjelenítendő célból biztosít felhasználónevet és e-mailt.

A Microsoft Entra ID vagy az Azure AD B2C esetében a AddMicrosoftIdentityWebApp (Identity, API-dokumentáció) használhatóMicrosoft.Identity.Web, amely az OIDC-t és a hitelesítési kezelőket is hozzáadja a megfelelő alapértelmezett értékekkel. A jelen cikkben szereplő mintaalkalmazás és útmutató nem használja a Microsoft Identity Web alkalmazást. Az útmutató bemutatja, hogyan konfigurálhatja az OIDC kezelőt manuálisan bármely OIDC-szolgáltatóhoz. A Microsoft Identity Web implementálásával kapcsolatos további információkért lásd: Blazor Web App.

A cikk ezen verziója az OIDC implementálását ismerteti anélkül, hogy bevezetné a háttérrendszer (BFF) mintáját egy olyan alkalmazással, amely globális interaktív kiszolgálói renderelést (egyetlen projektet) alkalmaz. A BFF-minta a külső szolgáltatásokra irányuló hitelesített kérések készítéséhez hasznos. Módosítsa a cikk verzióválasztóját BFF-mintára , ha az alkalmazás specifikációja a BFF-minta globális interaktív automatikus rendereléssel való bevezetésére szólít fel.

A következő specifikációt fogadjuk el:

A Microsoft Authentication Library for .NET, Microsoft Identity Web és Microsoft Entra ID használatával kapcsolatos alternatív élményért tekintse meg a Microsoft Entra ID-val történő ASP.NET Core Blazor Web App biztonságossá tételét.

Mintamegoldás

A mintaalkalmazás a következő projektekből áll:

  • BlazorWebAppOidcServer: Blazor Web App kiszolgálóoldali projekt (globális interaktív kiszolgáló renderelése).
  • MinimalApiJwt: Háttérbeli webes API minimális API-végponttal az időjárási adatokhoz.

A mintát a Blazor mintatár legújabb verziómappájában érheti el az alábbi hivatkozással. A minta a .NET 8 vagy újabb verzió BlazorWebAppOidcServer mappájában található.

Mintakód megtekintése vagy letöltése (letöltés)

Microsoft Entra ID-alkalmazásregisztrációk

Azt javasoljuk, hogy külön regisztrációkat használjunk alkalmazásokhoz és webes API-khoz, még akkor is, ha az alkalmazások és a webes API-k ugyanabban a megoldásban vannak. Az alábbi útmutató a BlazorWebAppOidcServer mintamegoldás alkalmazás- és MinimalApiJwt webes API-jára vonatkozik, de ugyanez az útmutató általában az alkalmazások és webes API-k Entra-alapú regisztrációira vonatkozik.

Először regisztrálja a webes API-t (MinimalApiJwt), hogy aztán hozzáférést biztosítson a webes API-hoz az alkalmazás regisztrálásakor. A webes API bérlőazonosítója és ügyfél-azonosítója az API saját Program fájljában kerül konfigurálásra. A webes API regisztrálása után tegye elérhetővé a webes API-t az Alkalmazásregisztrációk>API exponálása szakaszában egy hatókör nevével Weather.Get. Jegyezze fel az alkalmazásazonosító URI-ját az alkalmazás konfigurációjában való használatra.

Ezután regisztrálja az alkalmazást (BlazorWebAppOidcServer) egy webplatform-konfigurációval és egy átirányítási URI-val (nincs szükség portra).https://localhost/signin-oidc Az alkalmazás bérlőazonosítóját és ügyfél-azonosítóját, valamint a webes API alapcímét, az alkalmazásazonosító URI-ját és az időjárás-hatókör nevét használja az alkalmazás konfigurálásához a fájlban Program . Adjon api-engedélyt a webes API eléréséhez az Alkalmazásregisztrációk>. Ha az alkalmazás biztonsági specifikációja kéri, rendszergazdai hozzájárulást adhat a szervezetnek a webes API eléréséhez. A jogosult felhasználók és csoportok hozzá vannak rendelve az alkalmazás regisztrációihoz az Alkalmazásregisztrációk>Nagyvállalati alkalmazások szakaszban.

Az Entra vagy az Azure Portal implicit engedélyezési és hibrid folyamatok alkalmazásregisztrációs konfigurációjában ne jelölje be az engedélyezési végpont egyik jelölőnégyzetét sem az Access-jogkivonatok vagy az azonosító jogkivonatok visszaadásához. Az OpenID Connect kezelője automatikusan kéri a megfelelő tokeneket az engedélyezési végponttól a visszaadott kód segítségével.

Hozzon létre egy ügyféltitkot az alkalmazás regisztrációjában az Entra vagy az Azure portálon (Kezelés>Tanúsítványok és titkok>Új ügyféltitok). Őrizze meg az ügyfél titkos értékét a következő szakasz használatához.

A cikk későbbi részében további Entra-konfigurációs útmutatást talál az egyes beállításokhoz.

Az ügyfél titkos kódjának létrehozása

Ez a szakasz csak a Blazor Web App (BlazorWebAppOidcServer projekt) kiszolgálóprojektre vonatkozik.

Warning

Ne tárolja az alkalmazás titkos kulcsait, kapcsolati sztringeket, hitelesítő adatokat, jelszavakat, személyes azonosítószámokat (PIN-eket), titkos C#/.NET-kódot vagy titkos kulcsokat/jogkivonatokat az ügyféloldali kódban, ami mindig nem biztonságos. Tesztelési/előkészítési és éles környezetekben a kiszolgálóoldali Blazor kód- és webes API-knak biztonságos hitelesítési folyamatokat kell használniuk, amelyek nem őrzik meg a hitelesítő adatokat a projektkódban vagy a konfigurációs fájlokban. A helyi fejlesztési tesztelésen kívül javasoljuk, hogy kerülje a környezeti változók bizalmas adatok tárolására való használatát, mivel a környezeti változók nem a legbiztonságosabb megközelítések. A helyi fejlesztési teszteléshez a Titkos kulcskezelő eszköz ajánlott a bizalmas adatok védelméhez. További információ: Bizalmas adatok és hitelesítő adatok biztonságos karbantartása.

A helyi fejlesztési teszteléshez használja a Secret Manager eszközt a Blazor kiszolgálóprojekt ügyféltitkának tárolására a konfigurációs kulcs Authentication:Schemes:MicrosoftOidc:ClientSecretalatt.

A Blazor kiszolgálóprojekt nincs inicializálva a Secret Manager eszközhöz. A következő parancs végrehajtásához használjon egy parancshéjat, például a Visual Studióban a Developer PowerShell parancshéjat. A parancs végrehajtása előtt módosítsa a könyvtárat a cd paranccsal a kiszolgálóprojekt könyvtárára. A parancs létrehoz egy felhasználói titkos kód azonosítót (<UserSecretsId> az alkalmazás projektfájljában):

dotnet user-secrets init

Hajtsa végre a következő parancsot az ügyfél titkos kódjának beállításához. A {SECRET} helyőrző az alkalmazás regisztrációjából beszerzett ügyfélkód:

dotnet user-secrets set "Authentication:Schemes:MicrosoftOidc:ClientSecret" "{SECRET}"

A Visual Studio használata esetén a megoldáskezelőben a jobb gombbal a projektre kattintva és a Felhasználói titkos kódok kezelése lehetőség kiválasztásával ellenőrizheti, hogy a titkos kód be van-e állítva.

MinimalApiJwt projekt

A MinimalApiJwt projekt egy háttérbeli webes API több előtérbeli projekthez. A projekt minimális API-végpontot konfigurál az időjárási adatokhoz.

A MinimalApiJwt.http fájl használható az időjárási adatkérés teszteléséhez. Vegye figyelembe, hogy a végpont teszteléséhez a MinimalApiJwt projektnek futnia kell, a végpont pedig a fájlba van kódolva. További információ: .http-fájlok használata a Visual Studio 2022-ben.

A projekt csomagokat és konfigurációt tartalmaz OpenAPI-dokumentumok létrehozásához.

A projekt tartalmazza az OpenAPI-dokumentumok és a Swagger felhasználói felület fejlesztési környezetben való előállításához szükséges csomagokat és konfigurációkat. További információ: A létrehozott OpenAPI-dokumentumok használata.

A projekt létrehoz egy minimális API-végpontot az időjárási adatokhoz:

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();

Állítsa be a projektet a projekt JwtBearerOptions fájljában található AddJwtBearer hívás Program részénél.

A Authority szolgáltató beállítja az OIDC-hívások indítását. Javasoljuk, hogy a projekthez külön alkalmazásregisztrációt MinimalApiJwt használjon. A hatóság megegyezik az identitásszolgáltató által visszaadott JWT kibocsátójával (iss).

jwtOptions.Authority = "{AUTHORITY}";

A Hatóság formátuma a használatban lévő bérlő típusától függ. Az alábbi példák a Microsoft Entra-azonosítóhoz a következő bérlőazonosítót aaaabbbb-0000-cccc-1111-dddd2222eeeehasználják: .

példa ME-ID bérlői hatóságra:

jwtOptions.Authority = "https://sts.windows.net/aaaabbbb-0000-cccc-1111-dddd2222eeee";

Példa az AAD B2C bérlői szolgáltatóra:

jwtOptions.Authority = "https://login.microsoftonline.com/aaaabbbb-0000-cccc-1111-dddd2222eeee/v2.0";

A Audience kapott OIDC-jogkivonat célközönségét állítja be.

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

Note

A Microsoft Entra ID használatakor az értéknek csak az Alkalmazásazonosító URI elérési útjára kell illeszkednie, amely a Weather.Get beállításaiban van konfigurálva, amikor hozzáadja a hatókört az Entra vagy az Azure portálon. Az értékben ne adja meg a "Weather.Get" hatókör nevét.

A célközönség formátuma a használatban lévő bérlő típusától függ. A Microsoft Entra-azonosítóhoz az alábbi példák a bérlőazonosítót contoso és a következő ügyfél-azonosítót használják 11112222-bbbb-3333-cccc-4444dddd5555: .

példa ME-ID bérlői alkalmazásazonosító URI-jére:

jwtOptions.Audience = "api://11112222-bbbb-3333-cccc-4444dddd5555";

Példa az AAD B2C-bérlő alkalmazásazonosító URI-jére:

jwtOptions.Audience = "https://contoso.onmicrosoft.com/11112222-bbbb-3333-cccc-4444dddd5555";

BlazorWebAppOidcServer projekt

Az automatikus nem-interaktív jogkivonat-frissítést egy egyéni cookie frissítő (CookieOidcRefresher.cs) kezeli.

A DelegatingHandler (TokenHandler) kezeli a felhasználó hozzáférési jogkivonatának kimenő kérelmekhez való csatolását. A jogkivonat-kezelő csak statikus kiszolgálóoldali renderelés (statikus SSR) során fut, így a HttpContext használata ebben a forgatókönyvben biztonságos. További információ: IHttpContextAccessor/HttpContext ASP.NET Core-alkalmazásokbanBlazor, valamint ASP.NET Core-kiszolgálóoldali és Blazor Web App további biztonsági forgatókönyvekben.

TokenHandler.cs:

public class TokenHandler(IHttpContextAccessor httpContextAccessor) : 
    DelegatingHandler
{
    protected override async Task<HttpResponseMessage> SendAsync(
        HttpRequestMessage request, CancellationToken cancellationToken)
    {
        if (httpContextAccessor.HttpContext is null)
        {
            throw new Exception("HttpContext not available");
        }

        var accessToken = await httpContextAccessor.HttpContext
            .GetTokenAsync("access_token");

        request.Headers.Authorization =
            new AuthenticationHeaderValue("Bearer", accessToken);

        return await base.SendAsync(request, cancellationToken);
    }
}

A projekt Program fájljában a jogkivonat-kezelő (TokenHandler) szolgáltatásként regisztrálva van, és üzenetkezelőként megadva, amellyel a háttér AddHttpMessageHandler webes API-hoz biztonságos kéréseket lehet küldeni MinimalApiJwt, egy elnevezett HTTP-ügyfél ("ExternalApi") használatával.

builder.Services.AddScoped<TokenHandler>();

builder.Services.AddHttpClient("ExternalApi",
      client => client.BaseAddress = new Uri(builder.Configuration["ExternalApiUri"] ?? 
          throw new Exception("Missing base address!")))
      .AddHttpMessageHandler<TokenHandler>();

Az Weather összetevő az attribútumot használja a [Authorize] jogosulatlan hozzáférés megakadályozására. Az alkalmazás teljes körű engedélyezésének megköveteléséről az engedélyezési szabályzat révén, valamint a nyilvános végpontok egy részének engedélyezés alól történő kivételéről további információt a Razor Pages OIDC útmutatójában talál.

A ExternalApi HTTP-ügyfél időjárási adatokra vonatkozó kérést küld a biztonságos webes API-nak. OnInitializedAsync Az életciklus-eseménybenWeather.razor:

using var request = new HttpRequestMessage(HttpMethod.Get, "/weather-forecast");
var client = ClientFactory.CreateClient("ExternalApi");
using var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();

forecasts = await response.Content.ReadFromJsonAsync<WeatherForecast[]>() ??
    throw new IOException("No weather forecast!");

A projekt fájljában appsettings.json konfigurálja a külső API URI-t:

"ExternalApiUri": "{BASE ADDRESS}"

Example:

"ExternalApiUri": "https://localhost:7277"

A következő OpenIdConnectOptions konfiguráció található a projekt Program fájljában a AddOpenIdConnecthívásához:

PushedAuthorizationBehavior: A leküldéses engedélyezési kérelmek (PAR) támogatását szabályozza. Alapértelmezés szerint a PAR használata, ha az identitásszolgáltató felderítési dokumentuma (általában itt .well-known/openid-configurationtalálható) a PAR támogatását hirdeti. Ha PAR-támogatást szeretne igényelni az alkalmazáshoz, hozzárendelhet egy értéket PushedAuthorizationBehavior.Require. A PAR-t a Microsoft Entra nem támogatja, és az Entra nem tervezi, hogy a jövőben is támogatni tudja.

oidcOptions.PushedAuthorizationBehavior = PushedAuthorizationBehavior.UseIfAvailable;

SignInScheme: Beállítja a felhasználó identitásának sikeres hitelesítés utáni megőrzéséért felelős köztes szoftvernek megfelelő hitelesítési sémát. Az OIDC-kezelőnek olyan bejelentkezési sémát kell használnia, amely képes a felhasználói hitelesítő adatok megőrzésére a kérések között. A következő sor csupán szemléltetés céljából jelenik meg. Ha nincs megadva, a DefaultSignInScheme tartalék értékként használja a rendszer.

oidcOptions.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;

A openid és profile (Scope) hatókörei (nem kötelező): A openid és profile hatókörök alapértelmezés szerint azért is vannak konfigurálva, mert az OIDC-kezelő működéséhez szükségesek, de előfordulhat, hogy újra hozzá kell adni őket, ha a hatókörök szerepelnek a Authentication:Schemes:MicrosoftOidc:Scope konfigurációban. Általános konfigurációs útmutatásért tekintse meg ASP.NET Core és ASP.NET Core Blazor konfigurációjának konfigurációját.

oidcOptions.Scope.Add(OpenIdConnectScope.OpenIdProfile);

Konfigurálja a Weather.Get külső webes API elérésének hatókörét az időjárási adatokhoz. Az alábbi példa az Entra-azonosító egy ME-ID bérlői tartományban való használatára épül. Az alábbi példában a {APP ID URI} helyőrző az Entra vagy az Azure Portalon található, ahol a webes API elérhető. Bármely más identitásszolgáltató esetében használja a megfelelő hatókört.

oidcOptions.Scope.Add("{APP ID URI}/Weather.Get");

A hatókör formátuma a használatban lévő bérlő típusától függ. Az alábbi példákban a bérlő tartománya, contoso.onmicrosoft.comaz ügyfélazonosító pedig az 11112222-bbbb-3333-cccc-4444dddd5555.

példa ME-ID bérlői alkalmazásazonosító URI-jére:

oidcOptions.Scope.Add("api://11112222-bbbb-3333-cccc-4444dddd5555/Weather.Get");

Példa az AAD B2C-bérlő alkalmazásazonosító URI-jére:

oidcOptions.Scope.Add("https://contoso.onmicrosoft.com/11112222-bbbb-3333-cccc-4444dddd5555/Weather.Get");

SaveTokens: Meghatározza, hogy a hozzáférési és frissítési jogkivonatokat a sikeres engedélyezés után a AuthenticationProperties kell-e tárolni. Ez a tulajdonság true-ra van beállítva, így a frissítési jogkivonatot nem interaktív frissítéshez tárolják.

oidcOptions.SaveTokens = true;

Offline elérés hatóköre (Scope): A frissítési jogkivonathoz a offline_access hatókör szükséges.

oidcOptions.Scope.Add(OpenIdConnectScope.OfflineAccess);

Authority és ClientId: Beállítja az OIDC-hívások szolgáltatói és ügyfél-azonosítóját.

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

Az alábbi példa a következő bérlőazonosítót aaaabbbb-0000-cccc-1111-dddd2222eeee és ügyfél-azonosítót 00001111-aaaa-2222-bbbb-3333cccc4444használja:

oidcOptions.Authority = "https://login.microsoftonline.com/aaaabbbb-0000-cccc-1111-dddd2222eeee/v2.0";
oidcOptions.ClientId = "00001111-aaaa-2222-bbbb-3333cccc4444";

Több-bérlős alkalmazások esetén a "common" szolgáltatót kell használni. Használhatja a "közös" hatóságot az egybérlős alkalmazásokhoz, de egy egyéni IssuerValidator szükséges, ahogyan később a jelen szakaszban megmutatjuk.

oidcOptions.Authority = "https://login.microsoftonline.com/common/v2.0";

ResponseType: Az OIDC-kezelőt úgy konfigurálja, hogy csak engedélyezési kódfolyamatot hajt végre. Ebben a módban az implicit támogatások és a hibrid folyamatok szükségtelenek. Az OIDC kezelő automatikusan kéri a megfelelő tokeneket az engedélyezési végponttól visszaadott kód használatával.

oidcOptions.ResponseType = OpenIdConnectResponseType.Code;

MapInboundClaims, valamint a NameClaimType és RoleClaimTypekonfigurációja: Sok OIDC-kiszolgáló a "name" és "role" értékeket használja a SOAP/WS-Fed alapértelmezések helyett ClaimTypes-ban. Ha MapInboundClaimsfalseértékre van állítva, a kezelő nem végez jogcímleképezéseket, és a JWT-ből származó jogcímneveket az alkalmazás közvetlenül használja. Az alábbi példa a szerepkör jogcímtípusát a "roles" értékre állítja, amely a Microsoft Entra ID (ME-ID) számára megfelelő. További információért tekintse meg az identitásszolgáltató dokumentációját.

Note

MapInboundClaims-t a legtöbb OIDC-szolgáltatónál false-re kell beállítani, ami megakadályozza az állítások átnevezését.

oidcOptions.MapInboundClaims = false;
oidcOptions.TokenValidationParameters.NameClaimType = "name";
oidcOptions.TokenValidationParameters.RoleClaimType = "roles";

Elérési út konfigurációja: Az elérési utaknak meg kell egyeznie az átirányítási URI-nak (bejelentkezési visszahívási útvonal) és a kijelentkezés utáni átirányítási (kijelentkezési visszahívási útvonal) elérési útnak, amelyet az alkalmazás OIDC-szolgáltatónál való regisztrálásakor konfiguráltak. Az Azure Portalon az útvonalak az alkalmazás regisztrációjának Hitelesítési paneljén vannak konfigurálva. A bejelentkezési és a bejelentkezési útvonalakat átirányítási URI-kként kell regisztrálni. Az alapértelmezett értékek /signin-oidc és /signout-callback-oidc.

CallbackPath: Az alkalmazás alapútvonalán belüli kérelem elérési útja, ahol a user-agent visszaadódik.

Konfigurálja a kijelentkezett visszahívási útvonalat az alkalmazás OIDC-szolgáltatói regisztrációjában. Az alábbi példában a {PORT} helyőrző az alkalmazás portja:

https://localhost:{PORT}/signin-oidc

Note

A Microsoft Entra ID használatakor nincs szükség portra localhost címekhez. A legtöbb más OIDC-szolgáltatónak a megfelelő portra van szüksége.

SignedOutCallbackPath (konfigurációs kulcs: "SignedOutCallbackPath"): Az alkalmazás alapútvonalán belüli kérelem útvonala, amelyet az OIDC kezelője fog el, ahol a felhasználói ügynök először visszatér, miután kijelentkezett az identitásszolgáltatóból. A mintaalkalmazás nem állít be értéket az elérési úthoz, mert a rendszer a "/signout-callback-oidc" alapértelmezett értékét használja. A kérés elfogása után az OIDC kezelője a SignedOutRedirectUri vagy RedirectUrihelyére irányít át, ha meg vannak adva.

Konfigurálja a kijelentkezett visszahívási útvonalat az alkalmazás OIDC-szolgáltatói regisztrációjában. Az alábbi példában a {PORT} helyőrző az alkalmazás portja:

https://localhost:{PORT}/signout-callback-oidc

Note

A Microsoft Entra ID használatakor állítsa be az elérési utat a webplatform-konfiguráció Átirányítási URI bejegyzéseiben az Entra vagy az Azure Portalon. Az Entra használatakor nincs szükség portra localhost címekhez. A legtöbb más OIDC-szolgáltatónak a megfelelő portra van szüksége. Ha nem adja hozzá a kijelentkezett visszahívási útvonal URI-ját az alkalmazás Entra-regisztrációjához, az Entra megtagadja a felhasználó visszairányítását az alkalmazáshoz, és csupán arra kéri őket, hogy zárják be a böngészőablakot.

RemoteSignOutPath: Az ezen az útvonalon fogadott kérések miatt a kezelő meghívja a kijelentkezést a kijelentkezés sémája használatával.

Az alábbi példában a {PORT} helyőrző az alkalmazás portja:

https://localhost/signout-oidc

Note

A Microsoft Entra ID használatakor állítsa be az előtérbeli bejelentkezési URL-címet az Entra vagy az Azure Portalon. Az Entra használatakor nincs szükség portra localhost címekhez. A legtöbb más OIDC-szolgáltatónak a megfelelő portra van szüksége.

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

Példák (alapértelmezett értékek):

oidcOptions.CallbackPath = new PathString("/signin-oidc");
oidcOptions.SignedOutCallbackPath = new PathString("/signout-callback-oidc");
oidcOptions.RemoteSignOutPath = new PathString("/signout-oidc");

(Microsoft Azure csak a "közös" végponttal)TokenValidationParameters.IssuerValidator: Sok OIDC-szolgáltató használja az alapértelmezett kiállítói érvényesítőt, de figyelembe kell vennünk a {TENANT ID} által visszaadott Bérlőazonosítóval (https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration) paraméterezett kiállítót. További információkért lásd: SecurityTokenInvalidIssuerException az OpenID Connect és az Azure AD "common" végpont használatával (AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet #1731).

Kizárólag a "közös" végponttal rendelkező Microsoft Entra ID-t vagy Azure AD B2C-t használó alkalmazások esetén:

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

A Microsoft Entra ID vagy az Azure AD B2C esetében a AddMicrosoftIdentityWebApp (Identity, API-dokumentáció) használhatóMicrosoft.Identity.Web, amely az OIDC-t és a hitelesítési kezelőket is hozzáadja a megfelelő alapértelmezett értékekkel. A jelen cikkben szereplő mintaalkalmazás és útmutató nem használja a Microsoft Identity Web alkalmazást. Az útmutató bemutatja, hogyan konfigurálhatja az OIDC kezelőt manuálisan bármely OIDC-szolgáltatóhoz. A Microsoft Identity Web implementálásával kapcsolatos további információkért lásd: Blazor Web App.

A cikk ezen verziója az OIDC implementálását a Backend for Frontend (BFF) mintával ismerteti. Ha az alkalmazás specifikációja nem kéri a BFF-minta bevezetését, módosítsa a cikk verzióválasztóját nem BFF-mintára (interaktív automatikus megjelenítés) vagy nem BFF-mintára (interaktív kiszolgáló) (interaktív kiszolgálói renderelés).

Prerequisites

Aspire a Visual Studio 17.10-es vagy újabb verzióját igényli.

Tekintse meg a .Aspire

Mintamegoldás

A mintaalkalmazás a következő projektekből áll:

  • Aspire:
    • Aspire.AppHost: Az alkalmazás magas szintű vezénylési problémáinak kezelésére szolgál.
    • Aspire.ServiceDefaults: Az alapértelmezett Aspire alkalmazáskonfigurációkat tartalmazza, amelyek szükség szerint bővíthetők és testre szabhatók.
  • MinimalApiJwt: Háttér webes API, amely egy Minimal API példavégpontot tartalmaz az időjárási adatokhoz.
  • BlazorWebAppOidc: A Blazor Web Appkiszolgálóoldali projektje . A projekt YARP használatával proxyk kéréseket küld egy időjárás-előrejelzési végpontnak a háttér webes API-projektben (MinimalApiJwt) a access_token hitelesítésben cookietárolt adatokkal.
  • BlazorWebAppOidc.Client: A Blazor Web Appügyféloldali projektje.

A mintát a Blazor mintatár legújabb verziómappájában érheti el az alábbi hivatkozással. A minta a .NET 8 vagy újabb verzió BlazorWebAppOidcBff mappájában található.

Mintakód megtekintése vagy letöltése (letöltés)

Az Blazor Web Appautomatikus renderelési módot használja globális interaktivitással.

A kiszolgálóprojekt meghívja AddAuthenticationStateSerialization, hogy adjon hozzá egy kiszolgálóoldali hitelesítési állapotszolgáltatót, amely PersistentComponentState használ a hitelesítési állapot ügyfélhez való áramlásához. Az ügyfél meghívja AddAuthenticationStateDeserialization, hogy deszerializálja és használja a kiszolgáló által átadott hitelesítési állapotot. A hitelesítési állapot a WebAssembly-alkalmazás élettartamára van rögzítve.

A PersistingAuthenticationStateProvider osztály (PersistingAuthenticationStateProvider.cs) egy kiszolgálóoldali AuthenticationStateProvider, amely PersistentComponentState használ a hitelesítési állapotnak az ügyfélhez való áramlásához, amelyet a WebAssembly-alkalmazás élettartama során rögzítettek.

Ez az alkalmazás minden OIDC-hitelesítési folyamat kiindulópontja. Az OIDC manuálisan van konfigurálva az alkalmazásban, és nem támaszkodik a Microsoft Entra-azonosítóra vagy a Microsoft Identity Web-csomagokra , és a mintaalkalmazáshoz sem szükséges a Microsoft Azure üzemeltetése. A mintaalkalmazás azonban használható az Entra, a Microsoft Identity Web és az Azure-ban is.

Automatikus, nem interaktív tokenfrissítés egyéni cookie frissítő (CookieOidcRefresher.cs) segítségével.

A háttérrendszer (BFF) minta adoptálásra került, amely Aspire szolgáltatásfelderítéshez és a YARP segítségével a háttéralkalmazás időjárás-előrejelzési végpontjára irányuló kérelmek proxyzáshoz használatos.

A háttér webes API (MinimalApiJwt) JWT-bearer hitelesítéssel érvényesíti azokat a JWT-jogkivonatokat, amelyeket a Blazor Web App ment a bejelentkezés cookie során.

Aspire javítja a .NET-felhőbeli natív alkalmazások létrehozásának élményét. Egységes, véleményezett eszközöket és mintákat biztosít az elosztott alkalmazások létrehozásához és futtatásához.

A YARP (Még egy fordított proxy) egy fordított proxykiszolgáló létrehozásához használt kódtár. MapForwarder a Program kiszolgálóprojekt fájljában a megadott mintának megfelelő HTTP-kérések közvetlen továbbítása egy adott célhelyre a kimenő kérelem alapértelmezett konfigurációja, a testreszabott átalakítások és az alapértelmezett HTTP-ügyfél használatával:

  • A Weather összetevő kiszolgálón való megjelenítésekor az összetevő a ServerWeatherForecaster osztály használatával proxyzhatja az időjárási adatokra vonatkozó kérést a felhasználó hozzáférési jogkivonatával. IHttpContextAccessor.HttpContext megállapítja, hogy a HttpContext elérhető-e a GetWeatherForecastAsync metódus számára használatra. További információ: ASP.NET Core-összetevőkRazor.
  • Amikor az összetevő megjelenik a kliensen, a ClientWeatherForecaster szolgáltatási implementációt használja, amely egy előre konfigurált HttpClient-et alkalmaz (az ügyfélprojekt Program fájljában) a webes API-hívás kezdeményezésére a kiszolgálóprojekt irányába. A kiszolgálóprojekt /weather-forecast fájljában definiált minimális API-végpont (Program) átalakítja a kérést a felhasználó hozzáférési jogkivonatával az időjárási adatok lekéréséhez.

A (webes) API-hívásokról, amelyek szolgáltatás absztrakcióit használják s-ben, azcímű ASP.NET Core -alkalmazásból történő webes API meghívása témakörben olvashat.

Microsoft Entra ID-alkalmazásregisztrációk

Azt javasoljuk, hogy külön regisztrációkat használjunk alkalmazásokhoz és webes API-khoz, még akkor is, ha az alkalmazások és a webes API-k ugyanabban a megoldásban vannak. Az alábbi útmutató a BlazorWebAppOidc mintamegoldás alkalmazás- és MinimalApiJwt webes API-jára vonatkozik, de ugyanez az útmutató általában az alkalmazások és webes API-k Entra-alapú regisztrációira vonatkozik.

Először regisztrálja a webes API-t (MinimalApiJwt), hogy aztán hozzáférést biztosítson a webes API-hoz az alkalmazás regisztrálásakor. A webes API bérlőazonosítója és ügyfél-azonosítója az API saját Program fájljában kerül konfigurálásra. A webes API regisztrálása után tegye elérhetővé a webes API-t az Alkalmazásregisztrációk>API exponálása szakaszában egy hatókör nevével Weather.Get. Jegyezze fel az alkalmazásazonosító URI-ját az alkalmazás konfigurációjában való használatra.

Ezután regisztrálja az alkalmazást (BlazorWebAppOidc/BlazorWebApOidc.Client) egy webplatform-konfigurációval és egy átirányítási URI-val (nincs szükség portra).https://localhost/signin-oidc Az alkalmazás bérlőazonosítóját és ügyfél-azonosítóját, valamint a webes API alapcímét, az alkalmazásazonosító URI-ját és az időjárás-hatókör nevét használja az alkalmazás konfigurálásához a fájlban Program . Adjon api-engedélyt a webes API eléréséhez az Alkalmazásregisztrációk>. Ha az alkalmazás biztonsági specifikációja kéri, rendszergazdai hozzájárulást adhat a szervezetnek a webes API eléréséhez. A jogosult felhasználók és csoportok hozzá vannak rendelve az alkalmazás regisztrációihoz az Alkalmazásregisztrációk>Nagyvállalati alkalmazások szakaszban.

Az Entra vagy az Azure Portal implicit engedélyezési és hibrid folyamatok alkalmazásregisztrációs konfigurációjában ne jelölje be az engedélyezési végpont egyik jelölőnégyzetét sem az Access-jogkivonatok vagy az azonosító jogkivonatok visszaadásához. Az OpenID Connect kezelője automatikusan kéri a megfelelő tokeneket az engedélyezési végponttól a visszaadott kód segítségével.

Hozzon létre egy ügyféltitkot az alkalmazás regisztrációjában az Entra vagy az Azure portálon (Kezelés>Tanúsítványok és titkok>Új ügyféltitok). Őrizze meg az ügyfél titkos értékét a következő szakasz használatához.

A cikk későbbi részében további Entra-konfigurációs útmutatást talál az egyes beállításokhoz.

Az ügyfél titkos kódjának létrehozása

Ez a szakasz csak a Blazor Web App (BlazorWebAppOidc projekt) kiszolgálóprojektre vonatkozik.

Warning

Ne tárolja az alkalmazás titkos kulcsait, kapcsolati sztringeket, hitelesítő adatokat, jelszavakat, személyes azonosítószámokat (PIN-eket), titkos C#/.NET-kódot vagy titkos kulcsokat/jogkivonatokat az ügyféloldali kódban, ami mindig nem biztonságos. Tesztelési/előkészítési és éles környezetekben a kiszolgálóoldali Blazor kód- és webes API-knak biztonságos hitelesítési folyamatokat kell használniuk, amelyek nem őrzik meg a hitelesítő adatokat a projektkódban vagy a konfigurációs fájlokban. A helyi fejlesztési tesztelésen kívül javasoljuk, hogy kerülje a környezeti változók bizalmas adatok tárolására való használatát, mivel a környezeti változók nem a legbiztonságosabb megközelítések. A helyi fejlesztési teszteléshez a Titkos kulcskezelő eszköz ajánlott a bizalmas adatok védelméhez. További információ: Bizalmas adatok és hitelesítő adatok biztonságos karbantartása.

A helyi fejlesztési teszteléshez használja a Secret Manager eszközt a Blazor kiszolgálóprojekt ügyféltitkának tárolására a konfigurációs kulcs Authentication:Schemes:MicrosoftOidc:ClientSecretalatt.

A Blazor kiszolgálóprojekt nincs inicializálva a Secret Manager eszközhöz. A következő parancs végrehajtásához használjon egy parancshéjat, például a Visual Studióban a Developer PowerShell parancshéjat. A parancs végrehajtása előtt módosítsa a könyvtárat a cd paranccsal a kiszolgálóprojekt könyvtárára. A parancs létrehoz egy felhasználói titkos kód azonosítót (<UserSecretsId> a kiszolgálóalkalmazás projektfájljában):

dotnet user-secrets init

Hajtsa végre a következő parancsot az ügyfél titkos kódjának beállításához. A {SECRET} helyőrző az alkalmazás regisztrációjából beszerzett ügyfélkód:

dotnet user-secrets set "Authentication:Schemes:MicrosoftOidc:ClientSecret" "{SECRET}"

A Visual Studio használata esetén a titkos kód beállításának megerősítéséhez kattintson a jobb gombbal a kiszolgálóprojektre a Megoldáskezelőben , és válassza a Felhasználói titkos kódok kezelése lehetőséget.

Aspire projektek

A Aspire használatával kapcsolatos további információkért, valamint a mintaalkalmazás .AppHost és .ServiceDefaults projektjeinek részleteiért tekintse meg a Aspire dokumentációt.

Ellenőrizze, hogy teljesítette-e a Aspireelőfeltételeit. További információért lásd a Előfeltételek szakaszt a Gyorsindítás: Első Aspire megoldásának felépítése részben.

A mintaalkalmazás csak egy nem biztonságos HTTP-indítási profilt (http) konfigurál a fejlesztési tesztelés során való használatra. További információkért, beleértve a nem biztonságos és biztonságos indítási beállításokra vonatkozó példát, olvassa el a nem biztonságos átvitel engedélyezése (Aspiredokumentáció) című témakörtAspire.

MinimalApiJwt projekt

A MinimalApiJwt projekt egy háttérbeli webes API több előtérbeli projekthez. A projekt minimális API-végpontot konfigurál az időjárási adatokhoz. A Blazor Web App kiszolgálóoldali projekt (BlazorWebAppOidc) kérelmei a MinimalApiJwt projekthez kerülnek átirányításra.

A MinimalApiJwt.http fájl használható az időjárási adatkérés teszteléséhez. Vegye figyelembe, hogy a végpont teszteléséhez a MinimalApiJwt projektnek futnia kell, a végpont pedig a fájlba van kódolva. További információ: .http-fájlok használata a Visual Studio 2022-ben.

A projekt csomagokat és konfigurációt tartalmaz OpenAPI-dokumentumok létrehozásához.

A projekt tartalmazza az OpenAPI-dokumentumok és a Swagger felhasználói felület fejlesztési környezetben való előállításához szükséges csomagokat és konfigurációkat. További információ: A létrehozott OpenAPI-dokumentumok használata.

A biztonságos időjárás-előrejelzési adatvégpont a projekt fájljában Program található:

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();

A RequireAuthorization bővítménymetódus az útvonaldefiníció engedélyezését igényli. A projekthez hozzáadott vezérlők esetében adja hozzá az [Authorize] attribútumot a vezérlőhöz vagy a művelethez.

Állítsa be a projektet a projekt JwtBearerOptions fájljában található AddJwtBearer hívás Program részénél.

A Authority szolgáltató beállítja az OIDC-hívások indítását. Javasoljuk, hogy a projekthez külön alkalmazásregisztrációt MinimalApiJwt használjon. A hatóság megegyezik az identitásszolgáltató által visszaadott JWT kibocsátójával (iss).

jwtOptions.Authority = "{AUTHORITY}";

A Hatóság formátuma a használatban lévő bérlő típusától függ. Az alábbi példák a Microsoft Entra-azonosítóhoz a következő bérlőazonosítót aaaabbbb-0000-cccc-1111-dddd2222eeeehasználják: .

példa ME-ID bérlői hatóságra:

jwtOptions.Authority = "https://sts.windows.net/aaaabbbb-0000-cccc-1111-dddd2222eeee";

Példa az AAD B2C bérlői szolgáltatóra:

jwtOptions.Authority = "https://login.microsoftonline.com/aaaabbbb-0000-cccc-1111-dddd2222eeee/v2.0";

A Audience kapott OIDC-jogkivonat célközönségét állítja be.

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

Note

A Microsoft Entra ID használatakor az értéknek csak az Alkalmazásazonosító URI elérési útjára kell illeszkednie, amely a Weather.Get beállításaiban van konfigurálva, amikor hozzáadja a hatókört az Entra vagy az Azure portálon. Az értékben ne adja meg a "Weather.Get" hatókör nevét.

A célközönség formátuma a használatban lévő bérlő típusától függ. A Microsoft Entra-azonosítóhoz az alábbi példák a bérlőazonosítót contoso és a következő ügyfél-azonosítót használják 11112222-bbbb-3333-cccc-4444dddd5555: .

példa ME-ID bérlői alkalmazásazonosító URI-jére:

jwtOptions.Audience = "api://11112222-bbbb-3333-cccc-4444dddd5555";

Példa az AAD B2C-bérlő alkalmazásazonosító URI-jére:

jwtOptions.Audience = "https://contoso.onmicrosoft.com/11112222-bbbb-3333-cccc-4444dddd5555";

Kiszolgálóoldali Blazor Web App projekt (BlazorWebAppOidc)

Ez a szakasz a kiszolgálóoldali Blazor projekt konfigurálását ismerteti.

A projekt OpenIdConnectOptions fájljában található a következő Program konfiguráció a AddOpenIdConnect hívás során.

PushedAuthorizationBehavior: A leküldéses engedélyezési kérelmek (PAR) támogatását szabályozza. Alapértelmezés szerint a PAR használata, ha az identitásszolgáltató felderítési dokumentuma (általában itt .well-known/openid-configurationtalálható) a PAR támogatását hirdeti. Ha PAR-támogatást szeretne igényelni az alkalmazáshoz, hozzárendelhet egy értéket PushedAuthorizationBehavior.Require. A PAR-t a Microsoft Entra nem támogatja, és az Entra nem tervezi, hogy a jövőben is támogatni tudja.

oidcOptions.PushedAuthorizationBehavior = PushedAuthorizationBehavior.UseIfAvailable;

SignInScheme: Beállítja a felhasználó identitásának sikeres hitelesítés utáni megőrzéséért felelős köztes szoftvernek megfelelő hitelesítési sémát. Az OIDC-kezelőnek olyan bejelentkezési sémát kell használnia, amely képes a felhasználói hitelesítő adatok megőrzésére a kérések között. A következő sor csupán szemléltetés céljából jelenik meg. Ha nincs megadva, a DefaultSignInScheme tartalék értékként használja a rendszer.

oidcOptions.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;

A openid és profile (Scope) hatókörei (nem kötelező): A openid és profile hatókörök alapértelmezés szerint azért is vannak konfigurálva, mert az OIDC-kezelő működéséhez szükségesek, de előfordulhat, hogy újra hozzá kell adni őket, ha a hatókörök szerepelnek a Authentication:Schemes:MicrosoftOidc:Scope konfigurációban. Általános konfigurációs útmutatásért tekintse meg ASP.NET Core és ASP.NET Core Blazor konfigurációjának konfigurációját.

oidcOptions.Scope.Add(OpenIdConnectScope.OpenIdProfile);

SaveTokens: Meghatározza, hogy a hozzáférési és frissítési jogkivonatokat a sikeres engedélyezés után a AuthenticationProperties kell-e tárolni. Az érték true értékre van állítva a háttér webes API-projektből (MinimalApiJwt) származó időjárási adatokra vonatkozó kérelmek hitelesítéséhez.

oidcOptions.SaveTokens = true;

Offline elérés hatóköre (Scope): A frissítési jogkivonathoz a offline_access hatókör szükséges.

oidcOptions.Scope.Add(OpenIdConnectScope.OfflineAccess);

Az időjárási adatok webes API-ból való lekérésének hatókörei (Scope): Konfigurálja a Weather.Get külső webes API elérésének hatókörét az időjárási adatokhoz. Az alábbi példában a {APP ID URI} helyőrző az Entra vagy az Azure Portalon található, ahol a webes API elérhető. Bármely más identitásszolgáltató esetében használja a megfelelő hatókört.

oidcOptions.Scope.Add("{APP ID URI}/Weather.Get");

A hatókör formátuma a használatban lévő bérlő típusától függ. Az alábbi példákban a bérlő tartománya, contoso.onmicrosoft.comaz ügyfélazonosító pedig az 11112222-bbbb-3333-cccc-4444dddd5555.

példa ME-ID bérlői alkalmazásazonosító URI-jére:

oidcOptions.Scope.Add("api://11112222-bbbb-3333-cccc-4444dddd5555/Weather.Get");

Példa az AAD B2C-bérlő alkalmazásazonosító URI-jére:

oidcOptions.Scope.Add("https://contoso.onmicrosoft.com/11112222-bbbb-3333-cccc-4444dddd5555/Weather.Get");

Authority és ClientId: Beállítja az OIDC-hívások szolgáltatói és ügyfél-azonosítóját.

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

Az alábbi példa a következő bérlőazonosítót aaaabbbb-0000-cccc-1111-dddd2222eeee és ügyfél-azonosítót 00001111-aaaa-2222-bbbb-3333cccc4444használja:

oidcOptions.Authority = "https://login.microsoftonline.com/aaaabbbb-0000-cccc-1111-dddd2222eeee/v2.0";
oidcOptions.ClientId = "00001111-aaaa-2222-bbbb-3333cccc4444";

Több-bérlős alkalmazások esetén a "common" szolgáltatót kell használni. Használhatja a "közös" hatóságot az egybérlős alkalmazásokhoz, de egy egyéni IssuerValidator szükséges, ahogyan később a jelen szakaszban megmutatjuk.

oidcOptions.Authority = "https://login.microsoftonline.com/common/v2.0";

ResponseType: Az OIDC-kezelőt úgy konfigurálja, hogy csak engedélyezési kódfolyamatot hajt végre. Ebben a módban az implicit támogatások és a hibrid folyamatok szükségtelenek. Az OIDC kezelő automatikusan kéri a megfelelő tokeneket az engedélyezési végponttól visszaadott kód használatával.

oidcOptions.ResponseType = OpenIdConnectResponseType.Code;

MapInboundClaims, valamint a NameClaimType és RoleClaimTypekonfigurációja: Sok OIDC-kiszolgáló a "name" és "role" értékeket használja a SOAP/WS-Fed alapértelmezések helyett ClaimTypes-ban. Ha MapInboundClaimsfalseértékre van állítva, a kezelő nem végez jogcímleképezéseket, és a JWT-ből származó jogcímneveket az alkalmazás közvetlenül használja. Az alábbi példa a szerepkör jogcímtípusát a "roles" értékre állítja, amely a Microsoft Entra ID (ME-ID) számára megfelelő. További információért tekintse meg az identitásszolgáltató dokumentációját.

Note

MapInboundClaims-t a legtöbb OIDC-szolgáltatónál false-re kell beállítani, ami megakadályozza az állítások átnevezését.

oidcOptions.MapInboundClaims = false;
oidcOptions.TokenValidationParameters.NameClaimType = "name";
oidcOptions.TokenValidationParameters.RoleClaimType = "roles";

Elérési út konfigurációja: Az elérési utaknak meg kell egyeznie az átirányítási URI-nak (bejelentkezési visszahívási útvonal) és a kijelentkezés utáni átirányítási (kijelentkezési visszahívási útvonal) elérési útnak, amelyet az alkalmazás OIDC-szolgáltatónál való regisztrálásakor konfiguráltak. Az Azure Portalon az útvonalak az alkalmazás regisztrációjának Hitelesítési paneljén vannak konfigurálva. A bejelentkezési és a bejelentkezési útvonalakat átirányítási URI-kként kell regisztrálni. Az alapértelmezett értékek /signin-oidc és /signout-callback-oidc.

Konfigurálja a kijelentkezett visszahívási útvonalat az alkalmazás OIDC-szolgáltatói regisztrációjában. Az alábbi példában a {PORT} helyőrző az alkalmazás portja:

https://localhost:{PORT}/signin-oidc

Note

A Microsoft Entra ID használatakor nincs szükség portra localhost címekhez. A legtöbb más OIDC-szolgáltatónak a megfelelő portra van szüksége.

SignedOutCallbackPath (konfigurációs kulcs: "SignedOutCallbackPath"): Az alkalmazás alapútvonalán belüli kérelem útvonala, amelyet az OIDC kezelője fog el, ahol a felhasználói ügynök először visszatér, miután kijelentkezett az identitásszolgáltatóból. A mintaalkalmazás nem állít be értéket az elérési úthoz, mert a rendszer a "/signout-callback-oidc" alapértelmezett értékét használja. A kérés elfogása után az OIDC kezelője a SignedOutRedirectUri vagy RedirectUrihelyére irányít át, ha meg vannak adva.

Konfigurálja a kijelentkezett visszahívási útvonalat az alkalmazás OIDC-szolgáltatói regisztrációjában. Az alábbi példában a {PORT} helyőrző az alkalmazás portja:

https://localhost:{PORT}/signout-callback-oidc

Note

A Microsoft Entra ID használatakor állítsa be az elérési utat a webplatform-konfiguráció Átirányítási URI bejegyzéseiben az Entra vagy az Azure Portalon. Az Entra használatakor nincs szükség portra localhost címekhez. A legtöbb más OIDC-szolgáltatónak a megfelelő portra van szüksége. Ha nem adja hozzá a kijelentkezett visszahívási útvonal URI-ját az alkalmazás Entra-regisztrációjához, az Entra megtagadja a felhasználó visszairányítását az alkalmazáshoz, és csupán arra kéri őket, hogy zárják be a böngészőablakot.

RemoteSignOutPath: Az ezen az útvonalon fogadott kérések miatt a kezelő meghívja a kijelentkezést a kijelentkezés sémája használatával.

Az alábbi példában a {PORT} helyőrző az alkalmazás portja:

https://localhost/signout-oidc

Note

A Microsoft Entra ID használatakor állítsa be az előtérbeli bejelentkezési URL-címet az Entra vagy az Azure Portalon. Az Entra használatakor nincs szükség portra localhost címekhez. A legtöbb más OIDC-szolgáltatónak a megfelelő portra van szüksége.

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

Példák (alapértelmezett értékek):

oidcOptions.CallbackPath = new PathString("/signin-oidc");
oidcOptions.SignedOutCallbackPath = new PathString("/signout-callback-oidc");
oidcOptions.RemoteSignOutPath = new PathString("/signout-oidc");

(Microsoft Azure csak a "közös" végponttal)TokenValidationParameters.IssuerValidator: Sok OIDC-szolgáltató használja az alapértelmezett kiállítói érvényesítőt, de figyelembe kell vennünk a {TENANT ID} által visszaadott Bérlőazonosítóval (https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration) paraméterezett kiállítót. További információkért lásd: SecurityTokenInvalidIssuerException az OpenID Connect és az Azure AD "common" végpont használatával (AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet #1731).

Kizárólag a "közös" végponttal rendelkező Microsoft Entra ID-t vagy Azure AD B2C-t használó alkalmazások esetén:

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

Ügyféloldali Blazor Web App projekt (BlazorWebAppOidc.Client)

A BlazorWebAppOidc.Client projekt a Blazor Web Appügyféloldali projektje.

Az ügyfél meghívja AddAuthenticationStateDeserialization, hogy deszerializálja és használja a kiszolgáló által átadott hitelesítési állapotot. A hitelesítési állapot a WebAssembly-alkalmazás élettartamára van rögzítve.

A PersistentAuthenticationStateProvider osztály (PersistentAuthenticationStateProvider.cs) egy ügyféloldali AuthenticationStateProvider, amely meghatározza a felhasználó hitelesítési állapotát a kiszolgálón való megjelenítéskor a lapon tárolt adatok keresése révén. A hitelesítési állapot a WebAssembly-alkalmazás élettartamára van rögzítve.

Ha a felhasználónak be kell jelentkeznie vagy ki kell jelentkeznie, egy teljes oldal újrabetöltésére van szükség.

A mintaalkalmazás csak megjelenítendő célból biztosít felhasználónevet és e-mailt.

Csak a név- és szerepkör-követelések sorosítása

Ez a szakasz csak a nem BFF mintára (Interaktív automatikus) és BFF-mintára (Interaktív automatikus) és mintaalkalmazásaikra vonatkozik.

A Program fájlban az összes igény szerializálva van azáltal, hogy beállítjuk a(z) SerializeAllClaimstrue értékét. Ha csak a CSR-hez szükséges a név és szerepkör attribútumok szerializálása, távolítsa el a beállítást, vagy állítsa be false értékre.

Adja meg a konfigurációt a JSON-konfigurációszolgáltatóval (alkalmazásbeállítások)

A mintamegoldásprojektek úgy konfigurálják az OIDC- és JWT-tulajdonosi hitelesítést a fájljaikban Program , hogy a konfigurációs beállítások felderíthetők legyenek a C# automatikus kiegészítésével. A professzionális alkalmazások általában konfigurációszolgáltatót használnak az OIDC-beállítások konfigurálásához, például az alapértelmezett JSON-konfigurációs szolgáltatóhoz. A JSON-konfigurációszolgáltató betölti a konfigurációt az alkalmazásbeállítások fájljaiból appsettings.json/appsettings.{ENVIRONMENT}.json, ahol a {ENVIRONMENT} helyőrző az alkalmazás futtatókörnyezete. Kövesse az ebben a szakaszban található útmutatást az alkalmazásbeállítások konfigurációs fájljainak használatához.

Adja hozzá a következő JSON-konfigurációt a appsettings.jsonBlazorWebAppOidc projekt alkalmazásbeállítási fájljában (BlazorWebAppOidcServer):

"Authentication": {
  "Schemes": {
    "MicrosoftOidc": {
      "Authority": "https://login.microsoftonline.com/{TENANT ID (BLAZOR APP)}/v2.0",
      "ClientId": "{CLIENT ID (BLAZOR APP)}",
      "CallbackPath": "/signin-oidc",
      "SignedOutCallbackPath": "/signout-callback-oidc",
      "RemoteSignOutPath": "/signout-oidc",
      "SignedOutRedirectUri": "/",
      "Scope": [
        "openid",
        "profile",
        "offline_access",
        "{APP ID URI (WEB API)}/Weather.Get"
      ]
    }
  }
},

Frissítse az előző konfiguráció helyőrzőit, hogy megfeleljenek az alkalmazás által a Program fájlban használt értékeknek:

  • {TENANT ID (BLAZOR APP)}: Az alkalmazás bérlőazonosítója Blazor .
  • {CLIENT ID (BLAZOR APP)}: Az alkalmazás ügyfélazonosítója Blazor .
  • {APP ID URI (WEB API)}: A webes API alkalmazásazonosítójának URI-ja.

Az "általános" szolgáltatót (https://login.microsoftonline.com/common/v2.0) kell használni több-bérlős alkalmazások esetében. Az egybérlős alkalmazások "közös" autoritásának használatához lásd a Közös autoritás használata egybérlős alkalmazásokhoz című szakaszt.

Frissítse az előző konfigurációban szereplő többi értéket, hogy megfeleljen a Program fájlban használt egyéni/nem alapértelmezett értékeknek.

A konfigurációt a hitelesítés-készítő automatikusan felveszi.

Távolítsa el a következő sorokat a Program fájlból:

- oidcOptions.Scope.Add(OpenIdConnectScope.OpenIdProfile);
- oidcOptions.Scope.Add("...");
- oidcOptions.CallbackPath = new PathString("...");
- oidcOptions.SignedOutCallbackPath = new PathString("...");
- oidcOptions.RemoteSignOutPath = new PathString("...");
- oidcOptions.Authority = "...";
- oidcOptions.ClientId = "...";

ConfigureCookieOidc A metódusban CookieOidcServiceCollectionExtensions.cstávolítsa el a következő sort:

- oidcOptions.Scope.Add(OpenIdConnectScope.OfflineAccess);

A projektben MinimalApiJwt adja hozzá az alábbi alkalmazásbeállítások konfigurációját a appsettings.json fájlhoz:

"Authentication": {
  "Schemes": {
    "Bearer": {
      "Authority": "https://sts.windows.net/{TENANT ID (WEB API)}",
      "ValidAudiences": [ "{APP ID URI (WEB API)}" ]
    }
  }
},

Frissítse az előző konfiguráció helyőrzőit, hogy megfeleljenek az alkalmazás által a Program fájlban használt értékeknek:

  • {TENANT ID (WEB API)}: A webes API bérlőazonosítója.
  • {APP ID URI (WEB API)}: A webes API alkalmazásazonosítójának URI-ja.

A hatósági formátumok a következő mintákat követik:

  • ME-ID bérlő típusa: https://sts.windows.net/{TENANT ID}
  • Microsoft Entra külső azonosító: https://{DIRECTORY NAME}.ciamlogin.com/{TENANT ID}/v2.0
  • B2C-bérlő típusa: https://login.microsoftonline.com/{TENANT ID}/v2.0

A célközönségformátumok a következő mintákat használják ({CLIENT ID} a webes API ügyfélazonosítója; {DIRECTORY NAME} a címtár neve, például contoso: ):

  • ME-ID bérlő típusa: api://{CLIENT ID}
  • Microsoft Entra külső azonosító: {CLIENT ID}
  • B2C-bérlő típusa: https://{DIRECTORY NAME}.onmicrosoft.com/{CLIENT ID}

A beállítást a JWT-jogosítvány hitelesítési modulja automatikusan észleli.

Távolítsa el a következő sorokat a Program fájlból:

- jwtOptions.Authority = "...";
- jwtOptions.Audience = "...";

A konfigurációval kapcsolatos további információkért tekintse meg a következő erőforrásokat:

A "common" Authority használata egybérlős alkalmazásokhoz

Használhatja a "közös" hitelesítő hatóságot az egybérlős alkalmazásokhoz, de egyéni kibocsátó érvényesítő létrehozásához az alábbi lépéseket kell végrehajtania.

Adja hozzá a Microsoft.IdentityModel.Validators NuGet-csomagot az , BlazorWebAppOidcvagy BlazorWebAppOidcServer projekthezBlazorWebAppOidcBff.

Note

A csomagok .NET-alkalmazásokhoz való hozzáadásáról a Csomagok telepítése és kezelésea csomaghasználati munkafolyamatban (NuGet-dokumentáció) című cikkben talál útmutatást. Ellenőrizze a megfelelő csomagverziókat a NuGet.org.

Tegye elérhetővé a Program névteret a Microsoft.IdentityModel.Validators fájl tetején.

using Microsoft.IdentityModel.Validators;

Használja a következő kódot abban a fájlban, amelyben az Program OIDC-beállítások vannak konfigurálva:

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

További információkért lásd: SecurityTokenInvalidIssuerException az OpenID Connect és az Azure AD "common" végpont használatával (AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet #1731).

Átirányítás a kijelentkezés kezdőlapjára

A LogInOrOut összetevő (Layout/LogInOrOut.razor) egy rejtett mezőt állít be a visszatérési URL-címhez (ReturnUrl) az aktuális URL-címre (currentURL). Amikor a felhasználó kijelentkezik az alkalmazásból, az identitásszolgáltató visszaküldi a felhasználót arra a lapra, ahonnan kijelentkezett. Ha a felhasználó kijelentkezik egy biztonságos oldalról, a rendszer ugyanarra a biztonságos lapra küldi vissza őket, és a hitelesítési folyamat során visszaküldi őket. Ez a hitelesítési folyamat ésszerű, ha a felhasználóknak rendszeresen módosítaniuk kell a fiókokat.

Másik lehetőségként használja a következő LogInOrOut összetevőt, amely kijelentkezéskor nem ad vissza URL-címet.

Layout/LogInOrOut.razor:

<div class="nav-item px-3">
    <AuthorizeView>
        <Authorized>
            <form action="authentication/logout" method="post">
                <AntiforgeryToken />
                <button type="submit" class="nav-link">
                    <span class="bi bi-arrow-bar-left-nav-menu" aria-hidden="true">
                    </span> Logout
                </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>

Jogkivonat frissítése

Az egyéni cookie frissítő (CookieOidcRefresher.cs) implementáció automatikusan frissíti a felhasználó követeléseit, amikor azok lejárnak. A jelenlegi implementáció arra számít, hogy ID tokent kap a token végpontjától a frissítési tokenért cserébe. Az azonosító "ID token"-ben lévő jogcímek ezután felülírják a felhasználó jogcímeit.

A minta implementáció nem tartalmaz kódot a UserInfo végpontról történő jogosultságok igénylésére a token frissítésekor. További információ: BlazorWebAppOidc AddOpenIdConnect with GetClaimsFromUserInfoEndpoint = true doesn't propogate [sic] role claims to client (dotnet/aspnetcore #58826).

Note

Egyes identitásszolgáltatók csak frissítési jogkivonat használatakor adnak vissza hozzáférési jogkivonatot. A CookieOidcRefresher további logikával frissíthető annak érdekében, hogy továbbra is a hitelesítési cookie-ben tárolt korábbi jogosultságkészletet használja, vagy a hozzáférési token használatával jogosultságokat kérjen a UserInfo végponttól.

Titkosítási nonce

A nonce olyan sztringérték, amely egy ügyfél munkamenetét egy azonosító jogkivonattal társítja a visszajátszási támadások elkerülése érdekében.

Ha hitelesítés fejlesztése és tesztelése során nonce hibát kap, minden tesztfuttatáshoz használjon új InPrivate/inkognitó böngésző-munkamenetet, függetlenül attól, milyen kicsi a változtatás az alkalmazáson vagy a tesztfelhasználón. Az elavult cookie adatok nonce hibához vezethetnek. További információkért tekintse meg a Cookie-k és a webhelyadatok szakaszt .

A frissítési jogkivonatok új hozzáférési jogkivonatra való cseréjekor a nonce nem szükséges és nem kerül használatra. A mintaalkalmazásban a CookieOidcRefresher (CookieOidcRefresher.cs) szándékosan beállítja a OpenIdConnectProtocolValidator.RequireNonce-t a false-ra.

Alkalmazásszerepkörök a Microsoft Entrában nem regisztrált alkalmazásokhoz (ME-ID)

Ez a szakasz azokra az alkalmazásokra vonatkozik, amelyek nem használják a Microsoft Entra-azonosítót (ME-ID) identitásszolgáltatóként. A ME-ID-val regisztrált alkalmazásokkal kapcsolatban a Microsoft Entra (ME-ID) szakaszban találja meg az alkalmazásszerepköröket.

Konfigurálja a szerepkörhöz tartozó jogcím típusát (TokenValidationParameters.RoleClaimType) a OpenIdConnectOptionsProgram.cs-ban/-ben.

oidcOptions.TokenValidationParameters.RoleClaimType = "{ROLE CLAIM TYPE}";

Sok OIDC-identitásszolgáltató esetében a szerepkör jogcímtípusa role. Nézze meg az identitásszolgáltató dokumentációját, hogy megtalálja a megfelelő értéket.

Cserélje le a UserInfo osztályt a BlazorWebAppOidc.Client projektben a következő osztályra.

UserInfo.cs:

using Microsoft.AspNetCore.Components.WebAssembly.Authentication;
using System.Security.Claims;

namespace BlazorWebAppOidc.Client;

// Add properties to this class and update the server and client 
// AuthenticationStateProviders to expose more information about 
// the authenticated user to the client.
public sealed class UserInfo
{
    public required string UserId { get; init; }
    public required string Name { get; init; }
    public required string[] Roles { get; init; }

    public const string UserIdClaimType = "sub";
    public const string NameClaimType = "name";
    private const string RoleClaimType = "role";

    public static UserInfo FromClaimsPrincipal(ClaimsPrincipal principal) =>
        new()
        {
            UserId = GetRequiredClaim(principal, UserIdClaimType),
            Name = GetRequiredClaim(principal, NameClaimType),
            Roles = principal.FindAll(RoleClaimType).Select(c => c.Value)
                .ToArray(),
        };

    public ClaimsPrincipal ToClaimsPrincipal() =>
        new(new ClaimsIdentity(
            Roles.Select(role => new Claim(RoleClaimType, role))
                .Concat([
                    new Claim(UserIdClaimType, UserId),
                    new Claim(NameClaimType, Name),
                ]),
            authenticationType: nameof(UserInfo),
            nameType: NameClaimType,
            roleType: RoleClaimType));

    private static string GetRequiredClaim(ClaimsPrincipal principal,
        string claimType) =>
            principal.FindFirst(claimType)?.Value ??
            throw new InvalidOperationException(
                $"Could not find required '{claimType}' claim.");
}

Ezen a ponton az Razor összetevők szerepköralapú és szabályzatalapú engedélyezést alkalmazhatnak. Az alkalmazásszerepkörök role jogcímekben jelennek meg, szerepkörenként egy jogcímben.

Alkalmazásszerepkörök a Microsoft Entrában regisztrált alkalmazásokhoz (ME-ID)

Az ebben a szakaszban található útmutatással alkalmazásszerepköröket, ME-ID biztonsági csoportokat és ME-ID beépített rendszergazdai szerepköröket implementálhat a Microsoft Entra ID (ME-ID) azonosítót használó alkalmazásokhoz.

Az ebben a szakaszban leírt megközelítés úgy konfigurálja a ME-ID-t, hogy a csoportokat és szerepköröket elküldje a hitelesítési cookie fejlécben. Ha a felhasználók csak néhány biztonsági csoportnak és szerepkörnek tagjai, az alábbi módszernek a legtöbb üzemeltetési platformon működnie kell anélkül, hogy olyan problémába ütközik, amely miatt a fejlécek túl hosszúak, például olyan IIS-üzemeltetés esetén, amelynek alapértelmezett fejléchossz-korlátja 16 KB (MaxRequestBytes). Ha a fejléc hossza a nagy méretű csoport- vagy szerepkör-tagság miatt problémát okoz, azt javasoljuk, hogy ne kövesse az ebben a szakaszban található útmutatást, hanem inkább a Microsoft Graph használatát részesítse előnyben a felhasználó csoportjainak és szerepköreinek ME-ID szerinti külön beszerzésére. Ez a megközelítés nem növeli a hitelesítés cookie méretét. További információ: Hibás kérés – Túl hosszú kérés – IIS-kiszolgáló (dotnet/aspnetcore #57545).

A szerepkör jogcímtípusának (TokenValidationParameters.RoleClaimType) konfigurálása a OpenIdConnectOptionsProgram.cs elemében. Állítsa rolesértékre:

oidcOptions.TokenValidationParameters.RoleClaimType = "roles";

Bár nem rendelhet szerepköröket ME-ID Prémium szintű fiók nélküli csoportokhoz, szerepköröket rendelhet a felhasználókhoz, és szerepkörjogcímeket kaphat a standard Azure-fiókkal rendelkező felhasználókhoz. Az ebben a szakaszban található útmutatáshoz nincs szükség ME-ID Premium-fiókra.

Az alapértelmezett címtár használatakor kövesse az Alkalmazásszerepkörök hozzáadása az alkalmazáshoz című útmutatót, és fogadja őket a jogkivonatban (ME-ID dokumentációban) a szerepkörök konfigurálásához és hozzárendeléséhez. Ha nem az alapértelmezett címtárral dolgozik, szerkessze az alkalmazás jegyzékfájlját az Azure Portalon, hogy manuálisan hozza létre az alkalmazás szerepköreit a jegyzékfájl appRoles bejegyzésében. További információt a szerepkör jogcímének konfigurálása (ME-ID dokumentáció) című témakörben talál.

A felhasználó Azure-biztonsági csoportjai groups jogcímekként érkeznek, a felhasználó beépített ME-ID rendszergazdai szerepkör-hozzárendelései pedig jól ismert azonosítók (wids) jogcímekként érkeznek. Mindkét jogcímtípus értéke globálisan egyedi azonosító. Amikor az alkalmazás megkapja, ezek a jogcímek felhasználhatók az összetevők szerepkörének és szabályzatengedélyezésének létrehozásáraRazor.

Az alkalmazás jegyzékfájljában, az Azure Portalon állítsa az groupMembershipClaims attribútumotAll-re. A All értéke eredményezi, hogy ME-ID a bejelentkezett felhasználó összes biztonsági vagy terjesztési csoportját (groups jogcímeit) és szerepkörét (wids jogcímeket) küldi. A groupMembershipClaims attribútum beállítása:

  1. Nyissa meg az alkalmazás regisztrációját az Azure Portalon.
  2. Az oldalsávon válassza a > jegyzék kezelése lehetőséget.
  3. Keresse meg a groupMembershipClaims attribútumot.
  4. Állítsa az értéket All ("groupMembershipClaims": "All") értékre.
  5. Válassza a Mentés gombot.

Cserélje le a UserInfo osztályt a BlazorWebAppOidc.Client projektben a következő osztályra.

UserInfo.cs:

using Microsoft.AspNetCore.Components.WebAssembly.Authentication;
using System.Security.Claims;

namespace BlazorWebAppOidc.Client;

// Add properties to this class and update the server and client 
// AuthenticationStateProviders to expose more information about 
// the authenticated user to the client.
public sealed class UserInfo
{
    public required string UserId { get; init; }
    public required string Name { get; init; }
    public required string[] Roles { get; init; }
    public required string[] Groups { get; init; }
    public required string[] Wids { get; init; }

    public const string UserIdClaimType = "sub";
    public const string NameClaimType = "name";
    private const string RoleClaimType = "roles";
    private const string GroupsClaimType = "groups";
    private const string WidsClaimType = "wids";

    public static UserInfo FromClaimsPrincipal(ClaimsPrincipal principal) =>
        new()
        {
            UserId = GetRequiredClaim(principal, UserIdClaimType),
            Name = GetRequiredClaim(principal, NameClaimType),
            Roles = principal.FindAll(RoleClaimType).Select(c => c.Value)
                .ToArray(),
            Groups = principal.FindAll(GroupsClaimType).Select(c => c.Value)
                .ToArray(),
            Wids = principal.FindAll(WidsClaimType).Select(c => c.Value)
                .ToArray(),
        };

    public ClaimsPrincipal ToClaimsPrincipal() =>
        new(new ClaimsIdentity(
            Roles.Select(role => new Claim(RoleClaimType, role))
                .Concat(Groups.Select(role => new Claim(GroupsClaimType, role)))
                .Concat(Wids.Select(role => new Claim(WidsClaimType, role)))
                .Concat([
                    new Claim(UserIdClaimType, UserId),
                    new Claim(NameClaimType, Name),
                ]),
            authenticationType: nameof(UserInfo),
            nameType: NameClaimType,
            roleType: RoleClaimType));

    private static string GetRequiredClaim(ClaimsPrincipal principal,
        string claimType) =>
            principal.FindFirst(claimType)?.Value ??
            throw new InvalidOperationException(
                $"Could not find required '{claimType}' claim.");
}

Ezen a ponton az Razor összetevők szerepköralapú és szabályzatalapú engedélyezést alkalmazhatnak:

  • Az alkalmazásszerepkörök roles jogcímekben jelennek meg, szerepkörenként egy jogcímben.
  • A biztonsági csoportok groups jogcímekben jelennek meg, csoportonként egy jogcím. A biztonsági csoport grafikus felhasználói felületei megjelennek az Azure Portalon egy biztonsági csoport létrehozásakor, és megjelennek az Identity>csoportok>nézet kiválasztásakor>.
  • A beépített ME-ID rendszergazdai szerepkörök wids jogcímekben jelennek meg, szerepkörenként egy jogcímben. A wids jogcím, amelynek értéke b79fbf4d-3ef9-4689-8143-76b194e85509, mindig a ME-ID által kerül kiküldésre a bérlő nem vendégfiókjaihoz, és nem utal rendszergazdai szerepkörre. A rendszergazdai szerepkörök (szerepkörsablon azonosítói) megjelennek az Azure Portalon, amikor a Szerepkörök és rendszergazdák lehetőséget választjuk, majd a három pontot (...) követően a felsorolt szerepkör >leírására. A szerepkörsablon azonosítói a Microsoft Entra beépített szerepköreiben (Entra-dokumentáció) is megtalálhatók.

Alternatív megoldás: Duende Access Token Management

A mintaalkalmazásban egy egyéni cookie frissítő (CookieOidcRefresher.cs) implementációt használunk az automatikus nem interaktív jogkivonat-frissítés végrehajtásához. Alternatív megoldás a nyílt forráskódú Duende.AccessTokenManagement.OpenIdConnect csomagban található.

A Duende Access Token Management automatikus hozzáférési jogkivonat-kezelési funkciókat biztosít a .NET-feldolgozók és ASP.NET Core-webalkalmazások számára, beleértve Blazoraz egyéni cookie frissítők hozzáadása nélkül is.

A csomag telepítése után távolítsa el és adja hozzá a CookieOidcRefresher fájlban jelenleg bejelentkezett felhasználó hozzáférési jogkivonat-kezelését Program :

// Add services for token management
builder.Services.AddOpenIdConnectAccessTokenManagement();

// Register a typed HTTP client with token management support
builder.Services.AddHttpClient<InvoiceClient>(client =>
    {
        client.BaseAddress = new Uri("https://api.example.com/invoices/");
    })
    .AddUserAccessTokenHandler();

A beírt HTTP-ügyfél (vagy a http-ügyfél neve, ha implementálva van) automatikus hozzáférési jogkivonat-élettartam-kezeléssel rendelkezik az aktuálisan bejelentkezett felhasználó nevében, beleértve a transzparens frissítési jogkivonat-kezelést is.

További információt a Duende Access Token Management dokumentációjában Blazortalál.

Troubleshoot

Logging

A kiszolgálóalkalmazás egy standard ASP.NET Core-alkalmazás. A kiszolgálóalkalmazás alacsonyabb naplózási szintjének engedélyezéséhez tekintse meg a ASP.NET Alapvető naplózási útmutatót .

Ha engedélyezni szeretné a hibakeresést vagy a nyomkövetési naplózást a hitelesítéshezBlazor WebAssembly, tekintse meg a Blazor szakaszát, amelyben a cikk verzióválasztója ASP.NET Core a .NET 7-es vagy újabb verziójában.

Gyakori hibák

  • A hibakereső megszakít egy kivételnél a Microsoft Entra külső azonosítójával történő kijelentkezéskor.

    Az alábbi kivétel leállítja a Visual Studio hibakeresőt a Microsoft Entra külső azonosítójú kijelentkezés során:

    Uncaught TypeError TypeError: Failed to execute 'postMessage' on 'Window': The provided value cannot be converted to a sequence.

    A Visual Studio hibakereső megakadása JavaScript kivétel esetén a kijelentkezés során

    A kivétel az Entra JavaScript-kódból származik, így ez nem jelent problémát ASP.NET Core-val kapcsolatban. A kivétel nem befolyásolja az alkalmazások működését az éles környezetben, ezért a kivétel figyelmen kívül hagyható a helyi fejlesztési tesztelés során.

  • Az alkalmazás vagy Identity szolgáltató (IP) helytelen konfigurálása

    A leggyakoribb hibákat a helytelen konfiguráció okozza. Az alábbiakban néhány példát láthat:

    • A forgatókönyv követelményeitől függően egy hiányzó vagy helytelen szolgáltató, példány, bérlőazonosító, bérlői tartomány, ügyfélazonosító vagy átirányítási URI megakadályozza, hogy egy alkalmazás hitelesítse az ügyfeleket.
    • A helytelen kérelemtartományok megakadályozzák, hogy az ügyfelek hozzáférjenek a kiszolgáló webes API-végpontjaihoz.
    • Helytelen vagy hiányzó kiszolgálói API-engedélyek megakadályozzák, hogy az ügyfelek hozzáférjenek a kiszolgáló webes API-végpontjaihoz.
    • Az alkalmazás olyan porton való futtatása, amely eltér az IP-cím alkalmazásregisztrációjában megadott átirányítási URI portjától. Vegye figyelembe, hogy a Microsoft Entra-azonosítóhoz és egy localhost fejlesztési tesztelési címen futó alkalmazáshoz nincs szükség portra, de az alkalmazás portkonfigurációjának és a portnak, amelyen az alkalmazás fut, meg kell egyeznie a nemlocalhost címekhez.

    A cikkben szereplő konfigurációs lefedettség példákat mutat be a megfelelő konfigurációra. Gondosan ellenőrizze, hogy az alkalmazás és az IP-cím helytelenül van-e konfigurálva.

    Ha a konfiguráció helyesnek tűnik:

    • Alkalmazásnaplók elemzése.

    • Vizsgálja meg az ügyfélalkalmazás és az IP- vagy kiszolgálóalkalmazás közötti hálózati forgalmat a böngésző fejlesztői eszközeivel. Gyakran az IP vagy a kiszolgálóalkalmazás pontos hibaüzenetet, illetve egy olyan üzenetet küld vissza az ügyfélnek, amely arra utal, hogy mi okozza a problémát. A fejlesztői eszközökkel kapcsolatos útmutatást a következő cikkekben találja:

    A dokumentációs csapat válaszol a cikkekben szereplő dokumentumokkal kapcsolatos visszajelzésekre és hibákra (nyissa meg a problémát az Oldal visszajelzési szakaszából), de nem tud terméktámogatást nyújtani. Számos nyilvános támogatási fórum áll rendelkezésre az alkalmazások hibaelhárításához. A következőket javasoljuk:

    Az előző fórumok nem a Microsoft tulajdonában vagy ellenőrzése alatt állnak.

    A nem biztonsági, nem érzékeny és nem bizalmas, reprodukálható keretrendszer hibajelentései esetén nyisson meg egy problémát az ASP.NET Core termékegységnél. Ne nyisson meg egy problémát a termékegységben, amíg nem vizsgálja meg alaposan a probléma okát, és nem tudja önállóan és a közösség segítségével megoldani a problémát egy nyilvános támogatási fórumon. A termékegység nem tudja elhárítani a külső szolgáltatásokat érintő egyszerű helytelen konfiguráció vagy használati esetek miatt hibásan működő egyes alkalmazásokat. Ha egy jelentés bizalmas jellegű, vagy a kiberbűnözők által kihasználható termék biztonsági hibáját írja le, tekintse meg a Biztonsági problémák és hibák jelentése (dotnet/aspnetcore GitHub-adattár) című témakört.

  • Jogosulatlan ügyfél az ME-ID-hez

    info: Microsoft.AspNetCore.Authorization.DefaultAuthorizationService[2] Az engedélyezés nem sikerült. Ezek a követelmények nem teljesültek: DenyAnonymousAuthorizationRequirement: Hitelesített felhasználót igényel.

    Bejelentkezési visszahívási hiba a ME-ID-ből:

    • Hiba: unauthorized_client
    • Leírás: AADB2C90058: The provided application is not configured to allow public clients.

    A hiba megoldása:

    1. Az Azure Portalon érheti el az alkalmazás jegyzékfájlját.
    2. Állítsa be az allowPublicClient attribútumot null vagy true értékre.

Cookie-k és webhelyadatok

A cookie-k és a webhelyadatok az alkalmazásfrissítések során is megmaradhatnak, és zavarhatják a tesztelést és a hibaelhárítást. Törölje az alábbiakat, amikor az alkalmazáskódon, a szolgáltatónál vezetett felhasználói fiókon vagy a szolgáltatói alkalmazáskonfiguráción változtatásokat végez:

  • Felhasználói bejelentkezési cookie-k
  • Alkalmazás cookie-k
  • Gyorsítótárazott és tárolt webhely-adatok

Az egyik módszer a megmaradó cookie-k és webhelyadatok tesztelés és hibaelhárítás közbeni zavarásának elkerülésére a következő:

  • Böngésző konfigurálása
    • Használjon egy böngészőt a teszteléshez, amely konfigurálható az összes cookie és webhelyadatok törlésére minden alkalommal, amikor a böngésző bezárul.
    • Győződjön meg arról, hogy a böngésző manuálisan vagy az IDE által bezárva van az alkalmazás, a tesztfelhasználó vagy a szolgáltató konfigurációjának bármilyen módosításához.
  • Egyéni paranccsal nyisson meg egy böngészőt InPrivate vagy Inkognitó módban a Visual Studióban:
    • Nyissa meg a Tallózás párbeszédpanelt a Visual Studio Futtatás gombjáról.
    • Válassza a Add gombot.
    • Adja meg a böngésző elérési útját a Program mezőben. A következő végrehajtható elérési utak a Windows 10 tipikus telepítési helyei. Ha a böngésző más helyen van telepítve, vagy nem Windows 10-et használ, adja meg a böngésző végrehajtható fájljának elérési útját.
      • 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
    • Az Argumentumok mezőben adja meg azt a parancssori beállítást, amelyet a böngésző inPrivate vagy Inkognitó módban való megnyitáshoz használ. Egyes böngészőkben az alkalmazás URL-címe szükséges.
      • Microsoft Edge: A -inprivatehasználata.
      • Google Chrome: Használja a --incognito --new-window {URL}, ahol a {URL} helyőrző a megnyitni kívánt URL-cím (például https://localhost:5001).
      • Mozilla Firefox: Használja a -private -url {URL}, ahol a {URL} helyőrző a megnyitni kívánt URL-cím (például https://localhost:5001).
    • Adjon meg egy nevet a Barátságos név mezőben. Például Firefox Auth Testing.
    • Válassza az OK gombot.
    • Annak érdekében, hogy ne kelljen kiválasztania a böngészőprofilt az alkalmazással végzett tesztelés egyes iterációihoz, állítsa be a profilt alapértelmezettként az Alapértelmezettként beállítás gombbal.
    • Győződjön meg arról, hogy az IDE bezárja a böngészőt az alkalmazás, a tesztfelhasználó vagy a szolgáltató konfigurációjának bármilyen módosításához.

Alkalmazásfrissítések

A működő alkalmazások a .NET SDK fejlesztői gépen való frissítése vagy az alkalmazás csomagverzióinak módosítása után azonnal meghiúsulhatnak. Bizonyos esetekben az inkognitó csomagok megszakíthatják az alkalmazásokat a nagyobb frissítések végrehajtásakor. A legtöbb ilyen probléma az alábbi utasítások követésével javítható:

  1. Törölje a helyi rendszer NuGet-csomaggyorsítótárait a dotnet nuget locals all --clear parancs egy parancshéjból való végrehajtásával.
  2. Törölje a projekt bin és obj mappáit.
  3. Állítsa vissza és építse újra a projektet.
  4. Az alkalmazás ismételt üzembe helyezése előtt törölje a kiszolgáló üzembehelyezési mappájában lévő összes fájlt.

Note

Az alkalmazás cél-keretrendszerével nem kompatibilis csomagverziók használata nem támogatott. A csomaggal kapcsolatos információkért használja a NuGet-katalógust.

A megoldás indítása a megfelelő projektből

Blazor Web App:

  • A Backend-for-Frontend (BFF) minták egyikéhez indítsa el a megoldást a Aspire/Aspire.AppHost projekttel.
  • Az egyik nem BFF minta esetében kezdje a megoldást a kiszolgáló projekttel.

Blazor Server:

Indítsa el a megoldást a kiszolgálóprojektből.

A felhasználó vizsgálata

A következő UserClaims összetevő közvetlenül az alkalmazásokban használható, vagy a további testreszabás alapjául szolgál.

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.Any())
{
    <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;
    }
}

További erőforrások