我在 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"
我的定义有什么问题?
最佳答案
在 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/