Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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 aProgramProgram.csprojekt 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ő aServerWeatherForecaster-t használja a kiszolgálón, hogy időjárási adatokat szerezzen aMinimalApiJwtprojekt 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
ClientWeatherForecasterszolgáltatás implementációját használja, amely egy előre konfigurált HttpClient (az ügyfélprojekt fájljábanProgram) használatával kezdeményezi a webes API-hívást a kiszolgálóprojektbőlServerWeatherForecaster.
- Amikor a
- 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
PersistingAuthenticationStateProviderosztá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
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 Blazor Web Appkiszolgáló renderelési módját használja globális interaktivitással.
- 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:
-
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) aaccess_tokenhitelesí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ő aServerWeatherForecasterosztá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 aGetWeatherForecastAsyncmetódus számára használatra. További információ: ASP.NET Core-összetevőkRazor. - Amikor az összetevő megjelenik a kliensen, a
ClientWeatherForecasterszolgáltatási implementációt használja, amely egy előre konfigurált HttpClient-et alkalmaz (az ügyfélprojektProgramfájljában) a webes API-hívás kezdeményezésére a kiszolgálóprojekt irányába. A kiszolgálóprojekt/weather-forecastfá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
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
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:
- Nyissa meg az alkalmazás regisztrációját az Azure Portalon.
- Az oldalsávon válassza a > jegyzék kezelése lehetőséget.
- Keresse meg a
groupMembershipClaimsattribútumot. - Állítsa az értéket
All("groupMembershipClaims": "All") értékre. - 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
rolesjogcímekben jelennek meg, szerepkörenként egy jogcímben. - A biztonsági csoportok
groupsjogcí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
widsjogcímekben jelennek meg, szerepkörenként egy jogcímben. Awidsjogcím, amelynek értékeb79fbf4d-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 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
localhostfejleszté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 nemlocalhostcí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:
- Google Chrome (Google-dokumentáció)
- Microsoft Edge
- Mozilla Firefox (Mozilla-dokumentáció)
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/aspnetcoreGitHub-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:
- Az Azure Portalon érheti el az alkalmazás jegyzékfájlját.
- Állítsa be az
allowPublicClientattribútumotnullvagytrueértékre.
- Hiba:
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
- Microsoft Edge:
- 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áulhttps://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áulhttps://localhost:5001).
- Microsoft Edge: A
- 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ó:
- Törölje a helyi rendszer NuGet-csomaggyorsítótárait a
dotnet nuget locals all --clearparancs egy parancshéjból való végrehajtásával. - Törölje a projekt
binésobjmappáit. - Állítsa vissza és építse újra a projektet.
- 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.AppHostprojekttel. - 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
-
AzureAD/microsoft-identity-webGitHub-adattár: Hasznos útmutató a Microsoft Identity implementálásához Web for Microsoft Entra ID és Azure Active Directory B2C for ASP.NET Core-alkalmazásokhoz, beleértve a mintaalkalmazásokra mutató hivatkozásokat és a kapcsolódó Azure-dokumentációt. Jelenleg az Azure dokumentációja nem foglalkozik kifejezetten a Blazor Web App-val, de a Blazor Web App beállítása és konfigurálása a ME-ID és az Azure-üzemeltetéshez ugyanúgy történik, mint bármely ASP.NET Core webalkalmazás esetében. -
AuthenticationStateProviderszolgáltatás - Hitelesítési állapot kezelése az s-ben Blazor Web App
-
Jogkivonat frissítése http-kérés közben az Blazor interaktív kiszolgálón az OIDC-vel (
dotnet/aspnetcore#55213) - Adatok Blazor Web Appbiztonságossá tétele interaktív automatikus rendereléssel
-
Hogyan érhet el egy
AuthenticationStateProvideregyDelegatingHandler-ről