.net-core - Swagger 授权承载不发送

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

我在 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>()
                }
            });
        });

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

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

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

我的定义有什么问题?

最佳答案

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

那么,token是从哪里来的,为什么Swagger-UI找不到呢? token 位于从您的登录端点 (/api/Account/Login) 返回的 json 中。

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

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

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

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

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

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

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

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

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

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

在启动时,您只需设置一个“安全定义”,并添加一个处理“安全要求”的“OperationFilter”。然后“SecurityRequirement”引用“SecurityDefinition”,然后您就不会像在示例中那样在安全要求中重复安全定义配置(Scheme、Type、Name、In 等)。

引用this github post这向您展示了正确的方法。

关于.net-core - Swagger 授权承载不发送,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59808854/

相关文章:

java - swagger oauth 明白了,那么现在怎么办?

node.js - Swagger 生成器无法识别 Controller

.net - 通过 REST 在 DocumentDb 中创建文档时未经授权

c# - 连接的服务组件 Microsoft WCF Web 服务引用提供程序失败。(HRESULT : 0x80131500) the project format is incorrect

ASP.NET -> WCF 服务需要 Windows 身份验证

c# - ASP.NET MVC5 自定义身份验证

java - Swagger ReaderListener 在扫描过程中永远不会被拾取

.net-core - Visual Studio 2017 单元测试项目与 xUnit 测试项目

unit-testing - dotnet 核心的无约束隔离(模拟)框架

asp.net - <authorization> 节点的 Web.config 错误