使用 .Net Core 中的 PKCE 和 Okta 从 Swagger UI 连接 OpenID

Posted

技术标签:

【中文标题】使用 .Net Core 中的 PKCE 和 Okta 从 Swagger UI 连接 OpenID【英文标题】:OpenID Connect from Swagger UI with PKCE and Okta in .Net Core 【发布时间】:2021-03-02 18:58:25 【问题描述】:

过去 4 周在调试器中绕过控制器授权后,我最终决定在我支持 Swashbuckle 的 .NetCore 5 API 中处理 OpenID Connect 身份验证。我希望我没有,因为到目前为止我已经花了将近一天的时间没有找到可行的解决方案。

这里是一个简短的回顾。

最近才支持 Swagger-UI 中的 OpenID Connect。我发现此信息的唯一地方是海伦对this question 的评论。 Swagger Ui 3.38.0 仅在 Swashbuckle 6.0.7 中可用。 升级到最新的 Swashbuckle 后,我开始在 Swagger UI 中看到一堆“已发现”的授权选项。唉,基于错误,PKCE 似乎没有被使用,即使我在 Startup.cs 中明确设置了它:

.UseSwaggerUI(c => c.OAuthUsePkce());

此外,那里的 ClientSecret 没有意义,因为 PKCE 应该替换它(实际上我没有客户端密码)。 我的问题,是否有人在 Swagger UI 中使用 OpenID Connect with PKCE 和 Okta?

Auth ErrorError,错误:invalid_client,描述:浏览器对令牌端点的请求必须使用 Proof Key 进行代码交换。

【问题讨论】:

您可能需要使用 Swagger UI v. 3.43+,其中包括与 OIDC+PKCE 相关的 this change。 谢谢!原来我对 Swagger UI 版本的看法是错误的 - Swashbuckle 6.0.7 有 Swagger UI 3.42,但还不是 3.43。我会在几周后回到这个问题。 如果您解决了这个问题,请告诉我们 【参考方案1】:

我最近从隐式流转为代码+pkce 流。我遇到了同样的问题。关键是配置令牌端点 url。 Swagger UI 仍会向您显示客户端凭据输入框,但您可以在授权时将其留空。

var securityDefinition = new OpenApiSecurityScheme

    Type = SecuritySchemeType.OAuth2,
    Scheme = "Bearer",
    In = ParameterLocation.Header,
    Name = "Authorization",
    Flows = new OpenApiOAuthFlows
    
        AuthorizationCode = new OpenApiOAuthFlow
        
            AuthorizationUrl = new Uri(azureAdOptions.AuthorizeEndpoint),
            TokenUrl = new Uri(azureAdOptions.TokenEndpoint),
            Scopes = azureAdOptions.Applications["Api"].Scopes.ToDictionary(e => e.Value, e => e.Key)
        
    
;

c.AddSecurityDefinition(
    "oauth2",
    securityDefinition);

我显然仍然需要在 SwaggerUiOptions 上启用 pkce 支持

internal static void ConfigureUi(SwaggerUIOptions c, IConfiguration configuration, string apiName, string environmentName)

    c.OAuthUsePkce();


我使用 Azure AD,以下是我使用的值:

AuthorizationUrl: https://login.microsoftonline.com/organizations/oauth2/v2.0/authorize
TokenUrl: https://login.microsoftonline.com/organizations/oauth2/v2.0/token
Scopes: custom-value

下面的提交包含了它是如何实现的所有细节。它还包含一个测试样本。 Add support to PKCE for SwaggerUI & update OAuth2Integration sample

【讨论】:

所以目前基本上不可能将 OpenID-Connect 与 PKCE 一起使用?这是一个很好的解决方案,因为所需的所有数据(授权和令牌 URL)都在 Open-ID 配置中。如果它自己做发现就好了。

以上是关于使用 .Net Core 中的 PKCE 和 Okta 从 Swagger UI 连接 OpenID的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core 中的 IHttpActionResult 和辅助方法

JWT 不记名令牌不适用于 ASP.Net Core 3.1 + Identity Server 4

飞凌嵌入式 OK3399-C 开发板试用体验(.NET CORE的跨平台使用)

飞凌嵌入式 OK3399-C 开发板试用体验(.NET CORE的跨平台使用)

在 ReactJS 中的 Spotify API 上为 PKCE 身份验证创建代码验证器和质询

如何测试返回 Ok(object) 的 ASP.NET Core 2.2 Web API GET IActionResult?