将令牌授予类型推迟到 OpenIddict 内置处理程序

问题描述 投票:0回答:1

当在 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 );
        }

但是,根据所有样本,使用这种方法时似乎跳过了很多有用的验证。

asp.net-core openid-connect openiddict
1个回答
0
投票

但是,根据所有样本,使用这种方法时似乎跳过了很多有用的验证。

有两种类型的验证:

  • 基本协议验证:例如,确保授权代码未被篡改、未过期、由合法客户端(在 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
请求的逻辑:重用最初存储在授权码/刷新令牌中的声明。

如果您不想刷新声明或执行额外的检查,只需使用此代码片段就可以了。

© www.soinside.com 2019 - 2024. All rights reserved.