我有一个ASP.Net核心Rest与摇摆不定的一代 (.net v5和Swashbuckle.AspNetCore v5.6.3)记录在一起。它使用OAS3支持生成Swagger文档和UI。
另外,我的API使用JWT承载令牌。因此,我将此代码添加到swagger配置中:
options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme()
{
In = ParameterLocation.Header,
Name = "Authorization",
Type = SecuritySchemeType.ApiKey,
Description = "Put `bearer` keyword in front of token"
});
options.AddSecurityRequirement(new OpenApiSecurityRequirement()
{
{
new OpenApiSecurityScheme()
{
Reference = new OpenApiReference()
{
Id = "Bearer",
Type = ReferenceType.SecurityScheme
}
},
Array.Empty<string>()
}
});正如预期的那样,它将授权功能添加到Swagger UI中:

但是我也注意到每个HTTP请求旁边都有几个挂锁。它们在授权前被解锁:

在获得授权后,他们锁定:

如果需要授权或不需要授权,我如何才能让这些挂锁发出信号(我想我在某个地方见过同样的挂锁,他们也这么做似乎很自然)。
已经尝试过类似的方法,但是它没有工作(请求头不再包含jwt令牌):
options.OperationFilter<SecurityRequirementsOperationFilter>();我发现问题在于我的Swagger使用的是OAS3和SecurityRequirementsOperationFilter,这取决于OAS2。我尝试过寻找替代方案,但似乎没有类似的OAS3工具。
我该怎么办?我应该忘记这个功能吗?但这似乎是这些锁的唯一用途。是否有任何方法来拥有这个特性并继续使用OAS3 (我也不确定我是否真的那么需要OAS3支持)。
发布于 2020-11-25 06:38:21
经过一番研究,我在这里找到了答案:https://stackoverflow.com/a/61365691/13851956。
所以代码是:
options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme()
{
Description = "No need to put the `bearer` keyword in front of token",
Type = SecuritySchemeType.Http,
Scheme = "bearer",
BearerFormat = "JWT"
});
options.OperationFilter<AuthorizationOperationFilter>();public class AuthorizationOperationFilter : IOperationFilter
{
public void Apply(OpenApiOperation operation, OperationFilterContext context)
{
var actionMetadata = context.ApiDescription.ActionDescriptor.EndpointMetadata;
var isAuthorized = actionMetadata.Any(metadataItem => metadataItem is AuthorizeAttribute);
var allowAnonymous = actionMetadata.Any(metadataItem => metadataItem is AllowAnonymousAttribute);
if (!isAuthorized || allowAnonymous)
{
return;
}
operation.Parameters ??= new List<OpenApiParameter>();
operation.Security = new List<OpenApiSecurityRequirement>
{
new OpenApiSecurityRequirement
{
{
new OpenApiSecurityScheme
{
Reference = new OpenApiReference
{
Id = "Bearer",
Type = ReferenceType.SecurityScheme
}
},
Array.Empty<string>()
}
}
};
}
}其结果是,挂锁只出现在标记为AllowAnonymous属性而带有授权的操作旁边:

https://stackoverflow.com/questions/64992641
复制相似问题