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


OpenID Connect Web (UI) hitelesítés konfigurálása a ASP.NET Core-ban

Készítette: Damien Bowden

Mintakód megtekintése vagy letöltése

Ez a cikk a következő területeket ismerteti:

  • Mi az openID Connect bizalmas interaktív ügyfél?
  • OpenID Connect-ügyfél létrehozása a ASP.NET Core-ban
  • Példák OpenID Connect-ügyfélre kódrészletekkel
  • Külső OpenID Connect-szolgáltatói ügyfelek használata
  • Háttérrendszer az előtérbeli (BFF) biztonsági architektúrához
  • Speciális funkciók, szabványok, az OpenID Connect-ügyfél kiterjesztése

A Microsoft Authentication Library for .NET, a Microsoft Identity Web és a Microsoft Entra ID használatával kapcsolatos alternatív lehetőségekért tekintse meg a következő rövid útmutatót: Bejelentkezés a felhasználókba és a Microsoft Graph API meghívása egy ASP.NET Core-webalkalmazásból (Azure-dokumentáció).

Ha például a Microsoft Entra külső azonosítójú OIDC-kiszolgálót használja, tekintse meg a Felhasználók bejelentkezése egy külső bérlőben ASP.NET Core-webalkalmazás mintaalkalmazását , valamint egy ASP.NET Core-webalkalmazást, amely a Microsoft Entra külső azonosítójával hitelesíti a felhasználókat a Microsoft Identity Web használatával.

Mi az openID Connect bizalmas interaktív ügyfél?

Az OpenID Connect a hitelesítés megvalósításához használható ASP.NET Core-alkalmazásokban. A javasolt módszer egy OpenID Connect bizalmas ügyfél használata a kódfolyamat használatával. Az OAuth nyilvános ügyfelek (PKCE) által végzett kódcsere ellenőrzőkulcsának használata ajánlott ehhez a megvalósításhoz. Az alkalmazásügyfél és az alkalmazás felhasználója is hitelesítve lesz a bizalmas folyamatban. Az alkalmazásügyfél ügyféltitkot vagy ügyfél-állítást használ a hitelesítéshez.

A nyilvános OpenID Connect-/OAuth-ügyfelek már nem ajánlottak webalkalmazásokhoz.

Az alapértelmezett folyamat az alábbi ábrán látható módon működik:

OIDC-kódfolyam bizalmas ügyfele a PKCE használatával

Az OpenID Connect számos változatban létezik, és minden kiszolgálói implementáció némileg eltérő paraméterekkel és követelményekkel rendelkezik. Egyes kiszolgálók nem támogatják a felhasználói adatok végpontját, mások továbbra sem támogatják a PKCE-t, míg mások speciális paramétereket igényelnek a jogkivonat-kérelemben. Az ügyfél-állítások az ügyfél titkos kulcsai helyett használhatók. Új szabványok is léteznek, amelyek extra biztonságot adnak az OpenID Connect Core mellett, például FAPI, CIBA vagy DPoP az alsóbb rétegbeli API-khoz.

Megjegyzés:

A .NET 9-től az OAuth 2.0 leküldéses engedélyezési kérelmek (PAR) RFC 9126 alapértelmezés szerint használatosak, ha az OpenID Connect-kiszolgáló támogatja ezt. Ez egy három lépésből álló folyamat, nem pedig kétlépéses folyamat, ahogy fent látható. (A felhasználói adatok kérése nem kötelező lépés.)

Open ID Connect kódfolyamat-ügyfél létrehozása a Pages használatával Razor

Az alábbi szakasz bemutatja, hogyan implementálhat OpenID Connect-ügyfelet egy üres ASP.NET Core-lapprojektben Razor . Ugyanez a logika bármely ASP.NET Core-webes projektre alkalmazható, és csak a felhasználói felület integrációja különbözik.

OpenID Connect-támogatás hozzáadása

Adja hozzá a Microsoft.AspNetCore.Authentication.OpenIdConnect Nuget-csomagokat a ASP.NET Core-projekthez.

Az OpenID Connect-ügyfél beállítása

Adja hozzá a hitelesítést a webalkalmazáshoz a szerkesztővel. Szolgáltatások a Program.cs fájlban. A konfiguráció az OpenID Connect-kiszolgálótól függ. Minden OpenID Connect-kiszolgálóhoz kis különbségekre van szükség a beállításban.

Az OpenID Connect kezelője a kihívásokhoz és a kijelentkezéshez használható. Ez cookie a webalkalmazás munkamenetének kezelésére szolgál. A hitelesítés alapértelmezett sémái igény szerint megadhatók.

További információ: ASP.NET Core authentication-handler útmutató.

builder.Services.AddAuthentication(options =>
{
    options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddCookie()
.AddOpenIdConnect(options =>
{
    var oidcConfig = builder.Configuration.GetSection("OpenIDConnectSettings");

    options.Authority = oidcConfig["Authority"];
    options.ClientId = oidcConfig["ClientId"];
    options.ClientSecret = oidcConfig["ClientSecret"];

    options.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    options.ResponseType = OpenIdConnectResponseType.Code;

    options.SaveTokens = true;
    options.GetClaimsFromUserInfoEndpoint = true;

    options.MapInboundClaims = false;
    options.TokenValidationParameters.NameClaimType = JwtRegisteredClaimNames.Name;
    options.TokenValidationParameters.RoleClaimType = "roles";
});

A különböző OpenID Connect-beállításokkal kapcsolatos részletekért tekintse meg az ASP.NET Core Blazor Web App biztonságossá tételét az OpenID Connect (OIDC) használatával.

A különböző jogcímleképezési lehetőségekért lásd a jogcímek leképezését, testreszabását és átalakítását a ASP.NET Core-ban.

Megjegyzés:

A következő névterek szükségesek:

using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Authentication.OpenIdConnect;
using Microsoft.IdentityModel.Protocols.OpenIdConnect;
using Microsoft.IdentityModel.Tokens;

A konfigurációs tulajdonságok beállítása

Adja hozzá az OpenID Connect ügyfélbeállításokat az alkalmazáskonfiguráció tulajdonságaihoz. A beállításoknak meg kell egyeznie az OpenID Connect-kiszolgálón található ügyfélkonfigurációval. Nem szabad titkos kulcsokat tárolni az alkalmazásbeállításokban, ahol véletlenül be lehet jelentkezni. A titkos kulcsokat biztonságos helyen kell tárolni, például az Azure Key Vaultot éles környezetben, vagy fejlesztői környezetben a felhasználói titkos kulcsokat. További információ: Az alkalmazás titkos kulcsainak biztonságos tárolása a fejlesztés során ASP.NET Core.

"OpenIDConnectSettings": {
  // OpenID Connect URL. (The base URL for the /.well-known/openid-configuration)
  "Authority": "<Authority>",
  // client ID from the OpenID Connect server
  "ClientId": "<Client ID>",
  //"ClientSecret": "--stored-in-user-secrets-or-key-vault--"
},

Kijelentkezett visszahívási útvonal konfigurációja

A SignedOutCallbackPath (konfigurációs kulcs: "SignedOutCallbackPath") az alkalmazás alapútvonalán belüli kérelem útvonala, amelyet az OpenID Connect kezelője elfogja, ahol a felhasználói ügynök először visszatér az identitásszolgáltatótól való kijelentkezés után. 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 OpenID Connect kezelője átirányítja a SignedOutRedirectUri vagy a RedirectUri-re, ha az meg van 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

Megjegyzés:

A Microsoft Entra ID használatakor az elérési utat az webes platform konfigurációjának Átirányítási URI bejegyzéseiben állítsa be az Entra vagy az Azure portálon. 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.

Frissítse a ASP.NET Core-folyamat metódusát a programosztályban.

A UseRouting metódust a UseAuthorization metódus előtt kell végrehajtani.

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();
app.UseAuthentication();
// Authorization is applied for middleware after the UseAuthorization method
app.UseAuthorization();
app.MapRazorPages();

Kényszerített engedélyezés

Adja hozzá az [Authorize] attribútumot a védett Razor lapokhoz:

[Authorize]

Jobb módszer az egész alkalmazás engedélyezésének kényszerítése és a nem biztonságos oldalak letiltása:

var requireAuthPolicy = new AuthorizationPolicyBuilder()
    .RequireAuthenticatedUser()
    .Build();

builder.Services.AddAuthorizationBuilder()
    .SetFallbackPolicy(requireAuthPolicy);

Az attribútum nyilvános végpontokra való alkalmazásával tiltsa le az [AllowAnonymous] engedélyezést a nyilvános végpontokon. Példákért tekintse meg az Új Logout.cshtml és a SignedOut.cshtmlRazor lapok hozzáadása a projekthez és az Oldal implementálása Login témakör szakaszokat.

Új Logout.cshtml és SignedOut.cshtmlRazor lap hozzáadása a projekthez

Mind a cookie munkamenet, mind az OpenID Connect munkamenet kijelentkezéséhez kijelentkezés szükséges. A kijelentkezéshez az egész alkalmazásnak át kell irányítania az OpenID Connect-kiszolgálóra. A sikeres kijelentkezés után az alkalmazás megnyitja az RedirectUri útvonalat.

Implementáljon egy alapértelmezett bejelentkezési lapot, és módosítsa a Logout razor oldal kódját a következőre:

[Authorize]
public class LogoutModel : PageModel
{
    public IActionResult OnGetAsync()
    {
        return SignOut(new AuthenticationProperties
        {
            RedirectUri = "/SignedOut"
        },
        // Clear auth cookie
        CookieAuthenticationDefaults.AuthenticationScheme,
        // Redirect to OIDC provider signout endpoint
        OpenIdConnectDefaults.AuthenticationScheme);
    }
}

Ehhez SignedOut.cshtml az attribútum szükséges[AllowAnonymous]:

[AllowAnonymous]
public class SignedOutModel : PageModel
{
    public void OnGet()
    {
    }
}

Az oldal implementálása Login

Egy LoginRazor lap úgy is implementálható, hogy közvetlenül meghívja a ChallengeAsync a szükséges AuthProperties paraméterekkel. Ez nem szükséges, ha a webalkalmazás hitelesítést igényel, és az alapértelmezett kihívást használja.

A Login.cshtml laphoz a [AllowAnonymous] következő attribútum szükséges:

using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;

namespace RazorPageOidc.Pages;

[AllowAnonymous]
public class LoginModel : PageModel
{
    [BindProperty(SupportsGet = true)]
    public string? ReturnUrl { get; set; }

    public async Task OnGetAsync()
    {
        var properties = GetAuthProperties(ReturnUrl);
        await HttpContext.ChallengeAsync(properties);
    }

    private static AuthenticationProperties GetAuthProperties(string? returnUrl)
    {
        const string pathBase = "/";

        // Prevent open redirects.
        if (string.IsNullOrEmpty(returnUrl))
        {
            returnUrl = pathBase;
        }
        else if (!Uri.IsWellFormedUriString(returnUrl, UriKind.Relative))
        {
            returnUrl = new Uri(returnUrl, UriKind.Absolute).PathAndQuery;
        }
        else if (returnUrl[0] != '/')
        {
            returnUrl = $"{pathBase}{returnUrl}";
        }

        return new AuthenticationProperties { RedirectUri = returnUrl };
    }
}

Bejelentkezés és kijelentkezés gomb hozzáadása a felhasználóhoz

@if (Context.User.Identity!.IsAuthenticated)
{
	<li class="nav-item">
		<a class="nav-link text-dark" asp-area="" asp-page="/Logout">Logout</a>
	</li>

	<span class="nav-link text-dark">Hi @Context.User.Identity.Name</span>
}
else
{
	<li class="nav-item">
		<a class="nav-link text-dark" asp-area="" asp-page="/Index">Login</a>
	</li>
}

Példák kódrészletekkel

Példa a Felhasználói adatok végpont használata

Az OpenID Connect beállításaival jogcímeket képezhet le, kezelőket implementálhat, vagy akár mentheti a jogkivonatokat a munkamenetben későbbi használat céljából.

A Scope beállítással különböző jogcímeket vagy frissítési jogkivonatokat kérhet, amelyeket a rendszer információként küld el az OpenID Connect-kiszolgálónak. offline_access A kérés arra kéri a kiszolgálót, hogy adjon vissza egy referencia-jogkivonatot, amely a munkamenet frissítéséhez használható az alkalmazás felhasználójának ismételt hitelesítése nélkül.

services.AddAuthentication(options =>
{
    options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddCookie()
.AddOpenIdConnect(OpenIdConnectDefaults.AuthenticationScheme, options =>
{
    var oidcConfig = builder.Configuration.GetSection("OpenIDConnectSettings");
    options.Authority = oidcConfig["IdentityProviderUrl"];
    options.ClientSecret = oidcConfig["ClientSecret"];
    options.ClientId = oidcConfig["Audience"];
    options.ResponseType = OpenIdConnectResponseType.Code;

    options.Scope.Clear();
    options.Scope.Add("openid");
    options.Scope.Add("profile");
    options.Scope.Add("email");
    options.Scope.Add("offline_access");

    options.ClaimActions.Remove("amr");
    options.ClaimActions.MapUniqueJsonKey("website", "website");

    options.GetClaimsFromUserInfoEndpoint = true;
    options.SaveTokens = true;

    // .NET 9 feature
    options.PushedAuthorizationBehavior = PushedAuthorizationBehavior.Require;

    options.TokenValidationParameters.NameClaimType = "name";
    options.TokenValidationParameters.RoleClaimType = "role";
});

Microsoft-identitásszolgáltatók implementálása

A Microsoft több identitásszolgáltatóval és OpenID Connect-implementációval rendelkezik. A Microsoft különböző OpenID Connect-kiszolgálókkal rendelkezik:

  • Microsoft Entra ID
  • Microsoft Entra Külső ID
  • Azure AD B2C

Ha a Microsoft egyik identitásszolgáltatóját használja a ASP.NET Core-ban, javasoljuk, hogy használja a Microsoft.Identity.Web Nuget-csomagokat.

A Microsoft.Identity.Web Nuget-csomagok egy Microsoft-specifikus ügyfél, amely a ASP.NET Core OpenID Connect-ügyfélre épül az alapértelmezett ügyfél néhány módosításával.

Külső OpenID Connect-szolgáltatói ügyfelek használata

Számos OpenID Connect-kiszolgálói implementáció létrehoz olyan Nuget-csomagokat, amelyek ugyanarra az OpenID Connect-implementációra vannak optimalizálva. Ezek a csomagok implementálják az OpenID Connect ügyfélspecifikusjait az adott OpenID Connect-kiszolgáló által igényelt extrával. Microsoft.Identity.Web erre egy példa.

Ha több OpenID Connect-ügyfelet implementál egy alkalmazás különböző OpenID Connect-kiszolgálóiból, általában jobb, ha visszaáll az alapértelmezett ASP.NET Core-implementációra, mivel a különböző ügyfelek felülírnak néhány olyan lehetőséget, amely hatással van a többi ügyfélre.

Az OpenIddict webszolgáltatók olyan ügyfél-implementációk, amelyek számos különböző kiszolgálói implementációt támogatnak.

IdentityModel egy .NET szabványos segédkönyvtár jogcímalapú identitáshoz, az OAuth 2.0-hoz és az OpenID Connecthez. Ez az ügyfél megvalósításának elősegítésére is használható.

Háttérrendszer az előtérbeli (BFF) biztonsági architektúrához

Már nem ajánlott openID Connect nyilvános ügyfeleket implementálni semmilyen webalkalmazáshoz.

További információt a Browser-Based-alkalmazások OAuth 2.0-s tervezetében talál.

Ha olyan webalkalmazásokat implementál, amelyek nem rendelkeznek független háttérrendszerrel, javasoljuk, hogy használja a Háttérrendszer frontend (BFF) minta biztonsági architektúráját. Ez a minta különböző módokon implementálható, de a hitelesítés mindig a háttérrendszerben van implementálva, és a rendszer nem küld bizalmas adatokat a webes ügyfélnek a további engedélyezési vagy hitelesítési folyamatokhoz.

Speciális funkciók, szabványok, az OIDC-ügyfél kiterjesztése

Fakitermelés

Az OpenID Connect-ügyfelek hibakeresése nehéz lehet. A személyazonosításra alkalmas adatok (PII)-adatok alapértelmezés szerint nem naplózva. Ha a hibakeresés fejlesztési módban történik, a IdentityModelEventSource.ShowPII bizalmas személyes adatok naplózására használható. Ne helyezzen üzembe alkalmazásokat IdentityModelEventSource.ShowPII hatékony kiszolgálókon.

//using ...

using Microsoft.IdentityModel.Logging;

var builder = WebApplication.CreateBuilder(args);

//... code 

var app = builder.Build();

IdentityModelEventSource.ShowPII = true;

//... code 

app.Run();

További információ: naplózás.

Megjegyzés:

Érdemes lehet csökkenteni a konfigurált naplószintet az összes szükséges napló megtekintéséhez.

OIDC és OAuth paraméter testreszabása

Az OAuth és az OIDC hitelesítési kezelői (AdditionalAuthorizationParameters) lehetőség lehetővé teszi az olyan engedélyezési üzenetparaméterek testreszabását, amelyek általában az átirányítási lekérdezési sztring részeként szerepelnek.

Az OpenID Connect jogcímeinek térképezése

További információ: Jogcímek leképezése, testreszabása és átalakítása a ASP.NET Core-ban.

Blazor OpenID Connect

További információért lásd: ASP.NET Core Blazor Web App védelme az OpenID Connect (OIDC) segítségével.

Szabványok