.net core 虚张声势授权持有人不发送

.net core 虚张声势授权持有人不发送,.net-core,authorization,swagger,asp.net-core-webapi,bearer-token,.net Core,Authorization,Swagger,Asp.net Core Webapi,Bearer Token,我在dotnet core 3.1 web api项目中使用了Swagger Swashback,在向请求调用发送承载授权时遇到了麻烦。 我已经在我的ConfigureServices方法中定义了这一点: services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo() { Title = "MyApi", Version = "v1" });

我在dotnet core 3.1 web api项目中使用了Swagger Swashback,在向请求调用发送承载授权时遇到了麻烦。 我已经在我的
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>()
                }
            });
        });

我的定义有什么问题?

在cURL请求中,您可以看到:-H“Authorization:bearneundefined”。 这意味着,当Swagger UI尝试获取将添加到请求头的令牌时,找不到该令牌

那么,令牌来自何处,为什么Swagger UI找不到它?令牌来自登录端点返回的json(/api/Account/login)

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

必须从登录端点返回如下json响应:

{
       "access_token":"2YotnFZFEjr1zCsicMWpAA",
       "token_type":"bearer"
}
{
       "accessToken":"2YotnFZFEjr1zCsicMWpAA",
       "tokenType":"bearer"
}
这是一个常见的错误,当您序列化来自控制器的响应时,您不尊重json属性名。在示例中:您可以像下面这样返回json:

{
       "access_token":"2YotnFZFEjr1zCsicMWpAA",
       "token_type":"bearer"
}
{
       "accessToken":"2YotnFZFEjr1zCsicMWpAA",
       "tokenType":"bearer"
}
其中“accessToken”与“accessToken”不同,依此类推

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

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

[JsonPropertyName("access_token")]
[JsonProperty(PropertyName = "access_token")]
public string AccessToken { get; set; }
虽然所解释的是您问题的要点,但我想告诉您,在全局范围内添加安全需求并不是最正确的方法。通过这种方式,您可以保护所有端点,无论它们是否使用Authorize属性修饰

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


请参阅,它向您展示了正确的方法。

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

那么,令牌来自何处,为什么Swagger UI找不到它?令牌来自登录端点返回的json(/api/Account/login)

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

必须从登录端点返回如下json响应:

{
       "access_token":"2YotnFZFEjr1zCsicMWpAA",
       "token_type":"bearer"
}
{
       "accessToken":"2YotnFZFEjr1zCsicMWpAA",
       "tokenType":"bearer"
}
这是一个常见的错误,当您序列化来自控制器的响应时,您不尊重json属性名。在示例中:您可以像下面这样返回json:

{
       "access_token":"2YotnFZFEjr1zCsicMWpAA",
       "token_type":"bearer"
}
{
       "accessToken":"2YotnFZFEjr1zCsicMWpAA",
       "tokenType":"bearer"
}
其中“accessToken”与“accessToken”不同,依此类推

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

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

[JsonPropertyName("access_token")]
[JsonProperty(PropertyName = "access_token")]
public string AccessToken { get; set; }
虽然所解释的是您问题的要点,但我想告诉您,在全局范围内添加安全需求并不是最正确的方法。通过这种方式,您可以保护所有端点,无论它们是否使用Authorize属性修饰

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


请参阅,它向您展示了正确的操作方法。

那么,当您呼叫您的服务时,您的承载令牌没有从报头中的客户端发送?这不是你的服务的问题,而是你的客户的问题。@tomredfern是的,客户是狂妄自大的。狂妄自大不支持你试图做的事情。请改用类似postman的方法。很可能,
AddSecurityRequest
是使用错误的参数调用的。你能从生成的OpenAPI JSON/YAML文件中发布
securitySchemes
security
部分吗?这样,当你调用你的服务时,你的承载令牌不会从客户端发送到头部?这不是你的服务的问题,而是你的客户的问题。@tomredfern是的,客户是狂妄自大的。狂妄自大不支持你试图做的事情。请改用类似postman的方法。很可能,
AddSecurityRequest
是使用错误的参数调用的。您可以发布生成的OpenAPI JSON/YAML文件中的
securitySchemes
security
部分吗?