目录

Proof Key for Code Exchange (PKCE)

PKCE机制最初旨在保护移动应用程序不被安装在同一设备上的恶意应用程序劫持其回调 URI,现已扩展到机密客户端以帮助减少授权代码泄漏所有版本的 OpenIddict 都完全支持此机制,并且可以在全局或每个客户端强制执行以阻止不发送 PKCE 参数的授权请求。

在全球层面启用 PKCE 实施

options.RequireProofKeyForCodeExchange()可以通过调用服务器选项在全球范围内强制执行代码交换的证明密钥:

services.AddOpenIddict()
    .AddServer(options =>
    {
        options.RequireProofKeyForCodeExchange();
    });

为每个客户端启用 PKCE 强制执行

代码交换的证明密钥也可以通过将其添加到附加到客户端的要求列表中来为每个客户端强制执行:

await manager.CreateAsync(new OpenIddictApplicationDescriptor
{
    ClientId = "mvc",
    ClientSecret = "901564A5-E7FE-42CB-B10D-61EF6A8F3654",
    ConsentType = ConsentTypes.Explicit,
    PostLogoutRedirectUris =
    {
        new Uri("https://localhost:44381/signout-callback-oidc")
    },
    RedirectUris =
    {
        new Uri("https://localhost:44381/signin-oidc")
    },
    Permissions =
    {
        Permissions.Endpoints.Authorization,
        Permissions.Endpoints.Logout,
        Permissions.Endpoints.Token,
        Permissions.GrantTypes.AuthorizationCode,
        Permissions.GrantTypes.RefreshToken,
        Permissions.ResponseTypes.Code,
        Permissions.Scopes.Email,
        Permissions.Scopes.Profile,
        Permissions.Scopes.Roles,
        Permissions.Prefixes.Scope   "demo_api"
    },
    Requirements =
    {
        Requirements.Features.ProofKeyForCodeExchange
    }
});

启用code_challenge_method=plain支持

默认情况下,OpenIddict 仅支持code_challenge_method=S256,这是最安全的代码质询方式,也是 PKCE 规范唯一要求的一种方式。code_challenge_method=plain虽然不推荐,但可以通过将其添加到来手动启用对该方法的支持OpenIddictServerOptions.CodeChallengeMethods

services.AddOpenIddict()
    .AddServer(options =>
    {
        options.Configure(options => options.CodeChallengeMethods.Add(CodeChallengeMethods.Plain));
    });