mirror of
https://gitee.com/dcren/openiddict-documentation.git
synced 2025-09-19 10:07:58 +08:00
Update the documentation pages
This commit is contained in:
@@ -234,8 +234,7 @@ Here's an example for the client credentials grant:</p>
|
||||
await _applicationManager.GetDisplayNameAsync(application),
|
||||
Destinations.AccessToken, Destinations.IdentityToken);
|
||||
|
||||
return SignIn(new ClaimsPrincipal(identity),
|
||||
OpenIddictServerAspNetCoreDefaults.AuthenticationScheme);
|
||||
return SignIn(new ClaimsPrincipal(identity), OpenIddictServerAspNetCoreDefaults.AuthenticationScheme);
|
||||
}
|
||||
}
|
||||
</code></pre></li>
|
||||
@@ -254,8 +253,7 @@ Here's an example for the client credentials grant:</p>
|
||||
var context = scope.ServiceProvider.GetRequiredService<ApplicationDbContext>();
|
||||
await context.Database.EnsureCreatedAsync();
|
||||
|
||||
var manager =
|
||||
scope.ServiceProvider.GetRequiredService<IOpenIddictApplicationManager>();
|
||||
var manager = scope.ServiceProvider.GetRequiredService<IOpenIddictApplicationManager>();
|
||||
|
||||
if (await manager.FindByClientIdAsync("console") is null)
|
||||
{
|
||||
|
@@ -6,9 +6,9 @@
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||||
<title>Introduction </title>
|
||||
<title>What's OpenIddict? </title>
|
||||
<meta name="viewport" content="width=device-width">
|
||||
<meta name="title" content="Introduction ">
|
||||
<meta name="title" content="What's OpenIddict? ">
|
||||
<meta name="generator" content="docfx 2.56.7.0">
|
||||
|
||||
<link rel="shortcut icon" href="../images/favicon.ico">
|
||||
@@ -91,17 +91,129 @@
|
||||
</div>
|
||||
|
||||
<article class="content wrap" id="_content" data-uid="">
|
||||
<h1 id="introduction">Introduction</h1>
|
||||
<h2 id="whats-openiddict">What's OpenIddict?</h2>
|
||||
|
||||
<h2 id="whats-openiddict">What's OpenIddict?</h2>
|
||||
<p>OpenIddict was born in late 2015 and was initially based on <strong><a href="https://github.com/aspnet-contrib/AspNet.Security.OpenIdConnect.Server">AspNet.Security.OpenIdConnect.Server</a></strong>
|
||||
(codenamed ASOS), a low-level OpenID Connect server middleware forked from OWIN/Katana's <code>OAuthAuthorizationServerMiddleware</code>. In 2020, ASOS was merged into OpenIddict 3.0
|
||||
to form a unified stack under the OpenIddict umbrella, while still offering an easy-to-use approach for new users and a low-level experience for advanced users.</p>
|
||||
<h2 id="why-an-openid-connect-server">Why an OpenID Connect server?</h2>
|
||||
<p>Adding an OpenID Connect server to your application <strong>allows you to support token authentication</strong>.
|
||||
It also allows you to manage all your users using local password or an external identity provider (e.g. Facebook or Google) for all your
|
||||
applications in one central place, with the power to control who can access your API and the information that is exposed to each client.</p>
|
||||
</article>
|
||||
<p>OpenIddict is <strong>an open source and versatile framework for building standard-compliant OAuth 2.0/OpenID Connect servers</strong>
|
||||
in any ASP.NET Core 2.1 (and higher) and legacy ASP.NET 4.6.1 (and higher) applications.</p>
|
||||
<p>OpenIddict was born in late 2015 and was initially based on <a href="https://github.com/aspnet-contrib/AspNet.Security.OpenIdConnect.Server">AspNet.Security.OpenIdConnect.Server</a>
|
||||
(codenamed ASOS), a low-level OpenID Connect server middleware inspired by the OAuth 2.0 authorization server middleware developed by Microsoft for the OWIN project
|
||||
and the first OpenID Connect server ever created for ASP.NET Core.</p>
|
||||
<p>In 2020, ASOS was merged into OpenIddict 3.0 to form a unified stack under the OpenIddict umbrella, while still offering an easy-to-use approach for new users
|
||||
and a low-level experience for advanced users thanks to a "degraded mode" that allows using OpenIddict in a stateless way (i.e without a backing database).</p>
|
||||
<p>As part of this process, native support for <code>Microsoft.Owin</code> was added to OpenIddict 3.0 to allow using it in legacy ASP.NET 4.6.1 (and higher) applications,
|
||||
making it an excellent candidate for replacing <code>OAuthAuthorizationServerMiddleware</code> and <code>OAuthBearerAuthenticationMiddleware</code> without having to migrate to ASP.NET Core.</p>
|
||||
<h2 id="core-concepts">Core concepts</h2>
|
||||
<h3 id="user-authentication">User authentication</h3>
|
||||
<p>Unlike other solutions, <strong>OpenIddict exclusively focuses on the OAuth 2.0/OpenID Connect protocol aspects of the authorization process</strong>
|
||||
and leaves user authentication up to the implementer: OpenIddict can be natively used with any form of user authentication like password, token,
|
||||
federated or Integration Windows Authentication. While convenient, using a membership stack like ASP.NET Core Identity is not required.</p>
|
||||
<p>Integration with OpenIddict is typically done by enabling the pass-through mode to handle requests in a controller action
|
||||
or in a minimal API handler or, for more complex scenarios, by directly using its advanced events model.</p>
|
||||
<h3 id="pass-through-mode">Pass-through mode</h3>
|
||||
<p>As with <code>OAuthAuthorizationServerMiddleware</code>, OpenIddict allows handling authorization, logout and token requests in custom controller actions or any other
|
||||
middleware able to hook into the ASP.NET Core or OWIN request processing pipeline. In this case, OpenIddict will always validate incoming requests first
|
||||
(e.g by ensuring the mandatory parameters are present and valid) before allowing the rest of the pipeline to be invoked: should any validation error occur,
|
||||
OpenIddict will automatically reject the request before it reaches user-defined controller actions or custom middleware.</p>
|
||||
<pre><code class="lang-csharp">builder.Services.AddOpenIddict()
|
||||
.AddServer(options =>
|
||||
{
|
||||
// Enable the authorization and token endpoints.
|
||||
options.SetAuthorizationEndpointUris("/authorize")
|
||||
.SetTokenEndpointUris("/token");
|
||||
|
||||
// Enable the authorization code flow.
|
||||
options.AllowAuthorizationCodeFlow();
|
||||
|
||||
// Register the signing and encryption credentials.
|
||||
options.AddDevelopmentEncryptionCertificate()
|
||||
.AddDevelopmentSigningCertificate();
|
||||
|
||||
// Register the ASP.NET Core host and configure the authorization endpoint
|
||||
// to allow the /authorize minimal API handler to handle authorization requests
|
||||
// after being validated by the built-in OpenIddict server event handlers.
|
||||
//
|
||||
// Token requests will be handled by OpenIddict itself by reusing the identity
|
||||
// created by the /authorize handler and stored in the authorization codes.
|
||||
options.UseAspNetCore()
|
||||
.EnableAuthorizationEndpointPassthrough();
|
||||
});
|
||||
</code></pre><pre><code class="lang-csharp">app.MapGet("/authorize", async (HttpContext context) =>
|
||||
{
|
||||
// Resolve the claims stored in the principal created after the Steam authentication dance.
|
||||
// If the principal cannot be found, trigger a new challenge to redirect the user to Steam.
|
||||
var principal = (await context.AuthenticateAsync(SteamAuthenticationDefaults.AuthenticationScheme))?.Principal;
|
||||
if (principal is null)
|
||||
{
|
||||
return Results.Challenge(properties: null, new[] { SteamAuthenticationDefaults.AuthenticationScheme });
|
||||
}
|
||||
|
||||
var identifier = principal.FindFirst(ClaimTypes.NameIdentifier)!.Value;
|
||||
|
||||
// Create a new identity and import a few select claims from the Steam principal.
|
||||
var identity = new ClaimsIdentity(TokenValidationParameters.DefaultAuthenticationType);
|
||||
identity.AddClaim(new Claim(Claims.Subject, identifier));
|
||||
identity.AddClaim(new Claim(Claims.Name, identifier).SetDestinations(Destinations.AccessToken));
|
||||
|
||||
return Results.SignIn(new ClaimsPrincipal(identity), properties: null, OpenIddictServerAspNetCoreDefaults.AuthenticationScheme);
|
||||
});
|
||||
</code></pre><h3 id="events-model">Events model</h3>
|
||||
<p>OpenIddict implements a powerful event-based model for its server and validation stacks: each part of the request processing logic is implemented as an event handler
|
||||
that can be removed, moved to a different position in the pipeline or replaced by a custom handler to override the default logic used by OpenIddict:</p>
|
||||
<pre><code class="lang-csharp">/// <summary>
|
||||
/// Contains the logic responsible of rejecting authorization requests that don't specify a valid prompt parameter.
|
||||
/// </summary>
|
||||
public class ValidatePromptParameter : IOpenIddictServerHandler<ValidateAuthorizationRequestContext>
|
||||
{
|
||||
/// <summary>
|
||||
/// Gets the default descriptor definition assigned to this handler.
|
||||
/// </summary>
|
||||
public static OpenIddictServerHandlerDescriptor Descriptor { get; }
|
||||
= OpenIddictServerHandlerDescriptor.CreateBuilder<ValidateAuthorizationRequestContext>()
|
||||
.UseSingletonHandler<ValidatePromptParameter>()
|
||||
.SetOrder(ValidateNonceParameter.Descriptor.Order + 1_000)
|
||||
.SetType(OpenIddictServerHandlerType.BuiltIn)
|
||||
.Build();
|
||||
|
||||
/// <inheritdoc/>
|
||||
public ValueTask HandleAsync(ValidateAuthorizationRequestContext context)
|
||||
{
|
||||
if (context is null)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(context));
|
||||
}
|
||||
|
||||
// Reject requests specifying prompt=none with consent/login or select_account.
|
||||
if (context.Request.HasPrompt(Prompts.None) && (context.Request.HasPrompt(Prompts.Consent) ||
|
||||
context.Request.HasPrompt(Prompts.Login) ||
|
||||
context.Request.HasPrompt(Prompts.SelectAccount)))
|
||||
{
|
||||
context.Logger.LogInformation(SR.GetResourceString(SR.ID6040));
|
||||
|
||||
context.Reject(
|
||||
error: Errors.InvalidRequest,
|
||||
description: SR.FormatID2052(Parameters.Prompt),
|
||||
uri: SR.FormatID8000(SR.ID2052));
|
||||
|
||||
return default;
|
||||
}
|
||||
|
||||
return default;
|
||||
}
|
||||
}
|
||||
</code></pre><p>In OpenIddict itself, event handlers are typically defined as dedicated classes but they can also be registered using delegates:</p>
|
||||
<pre><code class="lang-csharp">services.AddOpenIddict()
|
||||
.AddServer(options =>
|
||||
{
|
||||
options.AddEventHandler<HandleConfigurationRequestContext>(builder =>
|
||||
builder.UseInlineHandler(context =>
|
||||
{
|
||||
// Attach custom metadata to the configuration document.
|
||||
context.Metadata["custom_metadata"] = 42;
|
||||
|
||||
return default;
|
||||
}));
|
||||
});
|
||||
</code></pre></article>
|
||||
|
||||
</div>
|
||||
</main>
|
||||
|
@@ -163,9 +163,44 @@ and are no longer supported. Make sure your application (or intermediate librari
|
||||
<div class="IMPORTANT"><h5>Important</h5><p>If your application references the <code>OpenIdConnectConstants</code> class, update it to use <code>OpenIddictConstants</code> instead.</p>
|
||||
</div>
|
||||
<h2 id="update-the-references-to-the-entity-framework-coreentity-framework-6mongodb-models">Update the references to the Entity Framework Core/Entity Framework 6/MongoDB models</h2>
|
||||
<p>If your application references the <code>OpenIddictApplication</code>, <code>OpenIddictAuthorization</code>, <code>OpenIddictScope</code> or <code>OpenIddictToken</code> models, update these reference to use
|
||||
their new names: <code>OpenIddict[provider name]Application</code>, <code>OpenIddict[provider name]Authorization</code>, <code>OpenIddict[provider name]Scope</code> and <code>OpenIddict[provider name]Token</code>
|
||||
(e.g when using MongoDB: <code>OpenIddictMongoDbApplication</code>, <code>OpenIddictMongoDbAuthorization</code>, <code>OpenIddictMongoDbScope</code> and <code>OpenIddictMongoDbToken</code>).</p>
|
||||
<p>If your application references the <code>OpenIddictApplication</code>, <code>OpenIddictAuthorization</code>, <code>OpenIddictScope</code> or <code>OpenIddictToken</code> models,
|
||||
update these reference to use their new names:</p>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Old name</th>
|
||||
<th>New name (Entity Framework Core)</th>
|
||||
<th>New name (Entity Framework 6)</th>
|
||||
<th>New name (MongoDB)</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>OpenIddictApplication</td>
|
||||
<td>OpenIddictEntityFrameworkCoreApplication</td>
|
||||
<td>OpenIddictEntityFrameworkApplication</td>
|
||||
<td>OpenIddictMongoDbApplication</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>OpenIddictAuthorization</td>
|
||||
<td>OpenIddictEntityFrameworkCoreAuthorization</td>
|
||||
<td>OpenIddictEntityFrameworkAuthorization</td>
|
||||
<td>OpenIddictMongoDbAuthorization</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>OpenIddictScope</td>
|
||||
<td>OpenIddictEntityFrameworkCoreScope</td>
|
||||
<td>OpenIddictEntityFrameworkScope</td>
|
||||
<td>OpenIddictMongoDbScope</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>OpenIddictToken</td>
|
||||
<td>OpenIddictEntityFrameworkCoreToken</td>
|
||||
<td>OpenIddictEntityFrameworkToken</td>
|
||||
<td>OpenIddictMongoDbToken</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<h2 id="enable-aspnet-core-integration-in-the-server-and-validation-options">Enable ASP.NET Core integration in the server and validation options</h2>
|
||||
<p>With the base server and validation stacks being decoupled from ASP.NET Core, you now have to explicitly register the ASP.NET Core host in the server/validation options:</p>
|
||||
<pre><code class="lang-csharp">services.AddOpenIddict()
|
||||
@@ -339,8 +374,9 @@ and the hybrid flow MUST be explicitly opted in. If you use the hybrid flow, mak
|
||||
});
|
||||
</code></pre><h2 id="update-your-applications-to-grant-them-the-appropriate-response-type-permissions">Update your applications to grant them the appropriate response type permissions</h2>
|
||||
<p>New response type permissions - enforced by default - <a href="/configuration/application-permissions.html#response-type-permissions">have been introduced in 3.0</a>.</p>
|
||||
<p>If you have many applications to migrate, you can use <a href="https://github.com/openiddict/openiddict-core/issues/1138#issuecomment-713681158">this script</a>
|
||||
<div class="NOTE"><h5>Note</h5><p>If you have many applications to migrate, you can use <a href="https://github.com/openiddict/openiddict-core/issues/1138#issuecomment-713681158">this script</a>
|
||||
to infer appropriate response type permissions using the already granted grant types.</p>
|
||||
</div>
|
||||
</article>
|
||||
|
||||
</div>
|
||||
|
Reference in New Issue
Block a user