OpenIddict 代码交换验证密钥(Proof Key for Code Exchange)
起初设计为一种保护移动应用程序免受同设备上恶意应用程序劫持回调 URI 的方法,代码交换验证密钥(Proof Key for Code Exchange,PKCE) 机制已被扩展至机密客户端,以帮助缓解授权码泄露的问题。此机制被 OpenIddict 的所有版本完全支持,并且可全局或按客户端实施,以阻止不发送 PKCE 参数的授权请求。
全局启用 PKCE 强制执行
通过在服务器选项中调用 options.RequireProofKeyForCodeExchange()
,可在全局范围内强制执行代码交换验证密钥(PKCE):
services.AddOpenIddict()
.AddServer(options =>
{
options.RequireProofKeyForCodeExchange();
});
按客户端启用 PKCE 强制执行
代码交换验证密钥(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
}
});