当在 OpenIddict 库中仅使用授权代码流时,不需要实现令牌端点,因为该库本机处理访问令牌的授权代码交换。但是一旦您实现了额外的令牌授予类型,例如客户端凭据,如何将授权代码授予类型推迟到基础库而不是重新进行声明?
例如,Aridka 样本有这样的:
[HttpPost("~/connect/token"), IgnoreAntiforgeryToken, Produces("application/json")]
public async Task<IActionResult> Exchange()
{
var request = HttpContext.GetOpenIddictServerRequest();
if (request.IsClientCredentialsGrantType())
{
// <snip> set some claims ...
return SignIn(new ClaimsPrincipal(identity), OpenIddictServerAspNetCoreDefaults.AuthenticationScheme);
}
if (request.IsAuthorizationCodeGrantType())
{
//TODO: how to defer to underlying library in this case?
return new OkResult();
}
}
有没有办法让授权代码交换像我们添加
.EnableTokenEndpointPassthrough()
之前一样工作,而无需重新实现声明/主体建筑?
一个简单的技巧就是这样做:
if (request.IsAuthorizationCodeGrantType())
{
var result = await HttpContext.AuthenticateAsync( OpenIddictServerAspNetCoreDefaults.AuthenticationScheme );
return SignIn( result.Principal, OpenIddictServerAspNetCoreDefaults.AuthenticationScheme );
}
但是,根据所有样本,使用这种方法时似乎跳过了很多有用的验证。
但是,根据所有样本,使用这种方法时似乎跳过了很多有用的验证。
有两种类型的验证:
基本协议验证:例如,确保授权代码未被篡改、未过期、由合法客户端(在 OpenIddict 中称为“presenter”)发送或未在数据库中标记为已撤销。无论您是否使用传递模式,此逻辑均由 OpenIddict 本身强制执行。
额外的、特定于用户的验证:例如,刷新声明或确保用户仍然允许登录。由于 OpenIddict 与您的成员资格堆栈(例如 ASP.NET Core Identity)完全断开连接,因此它不会执行检查对于您来说,无论您决定使用传递模式还是让它自动处理
grant_type=authorization_code
请求。
一个简单的技巧就是这样做:
var result = await HttpContext.AuthenticateAsync( OpenIddictServerAspNetCoreDefaults.AuthenticationScheme ); return SignIn( result.Principal, OpenIddictServerAspNetCoreDefaults.AuthenticationScheme ); } ```
当您不使用传递模式时,这正是 OpenIddict 处理
grant_type=authorization_code
和 grant_type=refresh_token
请求的逻辑:重用最初存储在授权码/刷新令牌中的声明。
如果您不想刷新声明或执行额外的检查,只需使用此代码片段就可以了。