oauth2.0 OpenidDict 4.0 + MSAL.js由于发送范围而导致代码流+ PKCE失败

u4dcyp6a  于 2023-10-15  发布在  其他
关注(0)|答案(1)|浏览(117)

问题

Openididct v4开始拒绝PKCE的访问令牌请求(RFC 7636,当客户端交换授权代码时),如果客户端通过scopes(参考强制执行它的代码中的行)。v3.x的情况并非如此
然而,MSAL.js实现有他们所谓的“* 混合流 *”(docs),它混合了隐式授权和授权代码流,并且在交换授权代码时发送scopes。😟

示例

来自MSAL.js的请求:

curl --location 'https://localhost:5003/connect/token' \
--header 'Content-Type: application/x-www-form-urlencoded;charset=utf-8' \
--data 'client_id=XXX&redirect_uri=https%3A%2F%2Flocalhost:5003&scope=openid%20profile&code={THE_CODE}&x-client-SKU=msal.js.browser&x-client-VER=2.21.0&x-client-OS=&x-client-CPU=&x-ms-lib-capability=retry-after, h429&x-client-current-telemetry=5|865,0,,,|,&x-client-last-telemetry=5|0|865,33365111-6e2e-4707-946c-e93b095f6c1e|invalid_request|1,0&code_verifier=jJdT8dsU&grant_type=authorization_code&client_info=1&client-request-id=99933333-cdd4-4991-8dcb-1a28f3a0669d'

来自Openiddict的回复:

{
  "error": "invalid_request",
  "error_description": "The 'scope' parameter is not valid in this context.",
  "error_uri": "https://documentation.openiddict.com/errors/ID2074"
}

问题

有什么办法能让这张支票放松下来吗?
IMHO,Openiddict拒绝,在这种情况下,是过于僵硬的行为,警告就足够了。

0g0grzrc

0g0grzrc1#

交换授权码时对scopes的有争议的检查是在OpenIdDict v4(link to the commit)中添加的。从代码中可以看到:

  • 它所做的就是拒绝包含“scope”参数的代码请求;
  • 它是作为EventHandler构建的,这使得它很容易从管道中添加/删除(是的,它是在Exchange.DefaultHandlers中添加的,所以它默认为ON)。

因此,通过将这一行添加到AddServer()来删除处理程序是安全的:

options.RemoveEventHandler(OpenIddictServerHandlers.Exchange.ValidateScopeParameter.Descriptor)

下面是一个在DI容器中注册OpenIddict令牌服务器服务的示例(请参阅my GitHub example中的更多内容):

// Register the OpenIddict services
services.AddOpenIddict()
        // Register the OpenIddict server components.
        .AddServer(options =>
        {
            // Enable the authorization and token endpoints
            options 
                    .SetTokenEndpointUris("/connect/token")
                    .SetAuthorizationEndpointUris("/connect/authorize")
                    .AllowAuthorizationCodeFlow()
                    .RequireProofKeyForCodeExchange()
                    .AllowRefreshTokenFlow()

                // Remove a default guard that rejects auth code requests that contain a "scope" parameter
                    .RemoveEventHandler(OpenIddictServerHandlers.Exchange.ValidateScopeParameter.Descriptor);

                // Other settings go here

                // Register the ASP.NET Core host and configure the ASP.NET Core-specific options.  
                    .UseAspNetCore();
        })

相关问题