来自 Swagger UI 的 OpenID Connect 与 .Net Core 中的 PKCE 和 Okta
OpenID Connect from Swagger UI with PKCE and Okta in .Net Core
过去 4 周在调试器中绕过控制器授权后,我最终决定在我的 Swashbuckle 支持的 .NetCore 5 中解决 OpenID Connect 身份验证 API。我希望我没有,因为到目前为止我花了将近一天的时间都没有找到可行的解决方案。
这里是一个简短的回顾。
- Swagger 中对 OpenID Connect 的支持-UI 是最新的。我唯一找到此信息的地方是海伦对 this question 的评论。 Swagger Ui 3.38.0 仅在 Swashbuckle 6.0.7 中可用。
- 升级到最新的 Swashbuckle 后,我开始在 Swagger 中看到一堆“发现的”授权选项 UI。 las,基于错误,PKCE 似乎没有被使用,即使我在 Startup.cs:
中明确设置了它
.UseSwaggerUI(c => c.OAuthUsePkce());
此外,那里的 ClientSecret 没有意义,因为 PKCE 应该取代它(实际上我没有客户端机密)。
我的问题是,是否有人使用 OpenID Connect 与 PKCE 和 Okta 在 Swagger 中工作 UI?
Auth ErrorError,错误:invalid_client,描述:浏览器对令牌端点的请求必须使用证明密钥进行代码交换。
我最近从隐式流程转向代码+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
过去 4 周在调试器中绕过控制器授权后,我最终决定在我的 Swashbuckle 支持的 .NetCore 5 中解决 OpenID Connect 身份验证 API。我希望我没有,因为到目前为止我花了将近一天的时间都没有找到可行的解决方案。
这里是一个简短的回顾。
- Swagger 中对 OpenID Connect 的支持-UI 是最新的。我唯一找到此信息的地方是海伦对 this question 的评论。 Swagger Ui 3.38.0 仅在 Swashbuckle 6.0.7 中可用。
- 升级到最新的 Swashbuckle 后,我开始在 Swagger 中看到一堆“发现的”授权选项 UI。 las,基于错误,PKCE 似乎没有被使用,即使我在 Startup.cs: 中明确设置了它
.UseSwaggerUI(c => c.OAuthUsePkce());
此外,那里的 ClientSecret 没有意义,因为 PKCE 应该取代它(实际上我没有客户端机密)。 我的问题是,是否有人使用 OpenID Connect 与 PKCE 和 Okta 在 Swagger 中工作 UI?
Auth ErrorError,错误:invalid_client,描述:浏览器对令牌端点的请求必须使用证明密钥进行代码交换。
我最近从隐式流程转向代码+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