ASP.NET Core: OpenID Connect-eksempel med PKCE

Du skal bruge tre værdier fra udviklerkonsollen: klient-id’et, klienthemmeligheden (kun webserverapps) og den omdirigerings-URI, du har registreret. Resten står i discovery-dokumentet på https://identity.dazr.eu/.well-known/openid-configuration.

ASP.NET Core

Brug den indbyggede OpenID Connect-handler (Microsoft.AspNetCore.Authentication.OpenIdConnect, .NET 8 eller nyere). Registrér en webserver-app med redirect-URI’en https://app.example.eu/signin-oidc og til logout https://app.example.eu/signout-callback-oidc. Tre indstillinger tæller: Dazr returnerer koden i query-strengen, så sæt ResponseMode til query (handleren bruger som standard form_post); PKCE er påkrævet; og ID-tokens er signeret med ES256.

// Program.cs
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Authentication.OpenIdConnect;
using Microsoft.IdentityModel.Protocols.OpenIdConnect;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddAuthentication(options =>
{
    options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddCookie()
.AddOpenIdConnect(options =>
{
    options.Authority = "https://identity.dazr.eu";
    options.ClientId = builder.Configuration["Dazr:ClientId"];
    options.ClientSecret = builder.Configuration["Dazr:ClientSecret"];
    options.ResponseType = OpenIdConnectResponseType.Code;
    options.ResponseMode = OpenIdConnectResponseMode.Query;
    options.UsePkce = true;
    options.Scope.Clear();
    options.Scope.Add("openid");
    options.Scope.Add("profile");
    options.Scope.Add("email");
    options.GetClaimsFromUserInfoEndpoint = true;
    options.SaveTokens = true;  // keeps the ID token for sign-out (id_token_hint)
    options.MapInboundClaims = false;  // keep sub, email and name as they are
    options.TokenValidationParameters.NameClaimType = "name";
    options.TokenValidationParameters.ValidAlgorithms = new[] { "ES256" };
});

builder.Services.AddAuthorization();
var app = builder.Build();
app.UseAuthentication();
app.UseAuthorization();

app.MapGet("/signin", () => Results.Challenge(new() { RedirectUri = "/" }));
app.MapGet("/signout", () => Results.SignOut(new() { RedirectUri = "/" },
    new[] { CookieAuthenticationDefaults.AuthenticationScheme, OpenIdConnectDefaults.AuthenticationScheme }));
app.Run();

Dazr-sub er User.FindFirst("sub")?.Value. Gem den som kontonøgle. Opbevar client secret i user secrets eller en vault, aldrig i appsettings.json.

Mere til udviklere