Swagger UI 忽略 x-tokenName 扩展

Swagger UI ignoring x-tokenName extension

我在 .net-core 2.1 应用程序中使用 Swashbuckle v5.0.0 来生成我的 api-文档。

我添加了这个安全定义:

cfg.AddSecurityDefinition("oauth2", new OpenApiSecurityScheme
{
   Name = "oauth2",
   Type = SecuritySchemeType.OAuth2,
   Scheme = IdentityServerAuthenticationDefaults.AuthenticationScheme,
   Extensions = new Dictionary<string, IOpenApiExtension>
   {
      { "x-tokenName", new OpenApiString("token id_token") }
   },
   Flows = new OpenApiOAuthFlows()
   {
      Implicit = new OpenApiOAuthFlow()
      {
         Scopes = swaggerSettings.Scopes,
         AuthorizationUrl = new Uri(authorizationUrl),
         TokenUrl = new Uri(swaggerSettings.IdentityProviderUrl + "/connect/token"),
      }                                
   },
});

这是从中生成的 api 规范(只是重要部分):

它几乎可以完美运行,因为我什至可以大摇大摆地打开以下对话框 ui 并进行完全授权:

但问题是,即使 x-tokenName 值设置为 "token id_token"(这是 required 以接收还包含身份范围的访问令牌,如配置文件和 openid ),swagger发送的请求-ui,fiddler记录下来,是这样的(切到重要的部分):

GET /usermgmt/identityprovider/connect/authorize?response_type=token&[...]

在网络上,我可以找到关于我正在努力实现的目标的线程,它在一段时间内得到了支持,然后不再支持,我不知道现在是否支持 - 似乎不支持,但我认为此功能很重要,所以它应该在那里。

我需要这个,因为我想使用根据 swagger-ui.

请求创建的访问令牌从配置文件端点请求用户组

请帮忙:)

您误解了 Swagger UI 中 x-tokenName 的用途。此扩展指定要提取并随后在 Authorization: Bearer <token>.

中使用的 OAuth 2.0 令牌端点响应的字段

默认情况下,不记名令牌是从access_token:

中提取的
{
  "access_token": "abcde12345",
  "token_type": "Bearer",
  "expires_in": 3599,
  "id_token": "...."
}

=>

Authorization: Bearer abcde12345

如果安全方案定义指定,例如,x-tokenName: id_token,则 id_token 的值将用作不记名令牌:

{
  "access_token": "....",
  "token_type": "Bearer",
  "expires_in": 3599,
  "id_token": "xyz987"
}

=>

Authorization: Bearer xyz987

关于 x-tokenName 的更多信息:here and here


I want to achieve that the authorization link swagger ui generates and sends the user to the identity-provider contains "response_type=token id_token&[...]"

id_token 用于 Open ID Connect (OIDC) 流程,它是 OAuth 2.0 的扩展。 Swagger UI 目前 does not support OIDC。

当 Swagger UI 支持 OIDC 时,您还需要将安全方案定义从 type: oauth2 更改为 type: openIdConnect:

{
  ...
  "components": {
    "securitySchemes": {
      "openId": {
        "type": "openIdConnect",
        "openIdConnectUrl": "https://path/to/.well-known/openid-configuration"
      }
    }
  }
}