【问题标题】:Swagger Authorization bearer not sendSwagger 授权承载不发送
【发布时间】:2020-01-19 09:41:18
【问题描述】:

我在 dotnet core 3.1 web api 项目中使用 Swagger Swashbuckle,无法向请求调用发送不记名授权。 我在 ConfigureServices 方法中定义了这个:

        services.AddSwaggerGen(c =>
        {
            c.SwaggerDoc("v1", new OpenApiInfo() { Title = "MyApi", Version = "v1" });
            // Set the comments path for the Swagger JSON and UI.
            var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
            var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
            c.IncludeXmlComments(xmlPath);
            c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
            {
                Type = SecuritySchemeType.OAuth2,
                Flows = new OpenApiOAuthFlows()
                {
                    Password = new OpenApiOAuthFlow()
                    {

                        TokenUrl = new Uri("/api/Account/Login", UriKind.Relative),
                    }
                },
                In = ParameterLocation.Header,
                Name = "Authorization",
                Scheme = "Bearer",
            });
            c.AddSecurityRequirement(new OpenApiSecurityRequirement()
            {
                {
                    new OpenApiSecurityScheme()
                    {
                        Reference = new OpenApiReference()
                        {
                            Type = ReferenceType.SecurityScheme,
                            Id = "Bearer"
                        },
                        Scheme = "Bearer",
                        Type = SecuritySchemeType.Http,
                        Name = "Bearer",
                        In = ParameterLocation.Header
                    }, new List<string>()
                }
            });
        });

运行时,我看到显示登录对话框的授权按钮:

登录后,API 路由显示锁定的挂锁,但当我尝试使用它们时,我看到调用完成时没有返回的承载:

curl -X GET "http://localhost:5000/api/Account" -H "accept: */*" -H "Authorization: Bearer undefined"

我的定义有什么问题?

【问题讨论】:

  • 所以当您调用您的服务时,您的不记名令牌没有从标头中的客户端发送?这不是您的服务的问题,而是您的客户的问题。
  • @tomredfern 是的,客户很招摇。
  • Swashbuckle 不支持您尝试执行的操作。改用邮递员之类的东西。
  • 很可能,AddSecurityRequirement 被调用时使用了错误的参数。您可以从生成的 OpenAPI JSON/YAML 文件中发布 securitySchemessecurity 部分吗?

标签: .net-core authorization swagger asp.net-core-webapi bearer-token


【解决方案1】:

在 cURL 请求中你可以看到:-H "Authorization: Bearer undefined"。 这意味着当 Swagger-UI 尝试获取将添加到请求标头中的令牌时,找不到。

那么,令牌是从哪里来的,为什么 Swagger-UI 找不到它?令牌来自您的登录端点 (/api/Account/Login) 返回的 json。

您必须确保从您的登录端点返回的 json 符合 OAuth 密码流的预期格式,如 RFC6749 第 4.1.4 节(访问令牌响应)中所述。

您必须从您的登录端点返回一个像这样的 json 响应:

{
       "access_token":"2YotnFZFEjr1zCsicMWpAA",
       "token_type":"bearer"
}

这是一个常见的错误,当您序列化来自控制器的响应时,您不尊重 json 属性名称。例如:你可以像这样返回一个 json:

{
       "accessToken":"2YotnFZFEjr1zCsicMWpAA",
       "tokenType":"bearer"
}

其中“accessToken”与“access_token”不同等等。

这个小差异导致 Swagger-UI 在反序列化返回的 json 时找不到承载令牌。

提示:装饰响应对象的“AccessToken”属性,以便正确序列化。

[JsonPropertyName("access_token")]
[JsonProperty(PropertyName = "access_token")]
public string AccessToken { get; set; }

虽然解释的内容是您问题的重点,但我想告诉您,全局添加安全要求并不是最正确的方法。通过这种方式,您可以保护所有端点,无论它们是否使用 Authorize 属性进行装饰。

在启动时您只需设置一个“安全定义”,并添加一个处理“安全要求”的“操作过滤器”。然后“SecurityRequirement”引用“SecurityDefinition”,然后您不要像您在示例中所做的那样在安全要求中重复安全定义配置(方案、类型、名称、In 等)。

请参阅this github post,它会告诉您正确的操作方法。

【讨论】:

  • 当我使用库使我的 FastAPI 响应在 json 响应中具有 CamelCase 键时,这最终帮助了我。谢谢!!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-30
  • 2022-11-24
  • 2020-09-17
  • 2018-07-04
  • 2015-12-30
  • 2016-02-23
相关资源
最近更新 更多