我正在使用.net6.0创建一个api。我想为 api 文档添加 Swagger UI,我添加了它,并且它在大部分情况下都有效。我面临的唯一问题是 swagger UI 在存在的每个端点上显示挂锁。
下面是我的代码 - 程序.cs
builder.Services.AddSwaggerGen(options =>
{
options.SupportNonNullableReferenceTypes();
options.OperationFilter<MyApi.API.Filters.SecurityRequirementsOperationFilter>();
options.OperationFilter<AppendAuthorizeToSummaryOperationFilter>();
options.SwaggerDoc("v1", new OpenApiInfo() { Title = "MyAPI API", Version = "v1" });
options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme()
{
In = ParameterLocation.Header,
Description = "Please enter a valid token",
Name = "Authorization",
Type = SecuritySchemeType.Http,
BearerFormat = "JWT",
Scheme = "Bearer"
});
options.AddSecurityRequirement(new OpenApiSecurityRequirement()
{
{
new OpenApiSecurityScheme()
{
Reference=new OpenApiReference()
{
Type=ReferenceType.SecurityScheme,
Id="Bearer"
}
},
new string[]{}
}
});
options.IncludeXmlComments(xmlPath);
});
如您所见,我使用操作过滤器来标记授权选项。
SecurityRequirementsOperationFilter.cs(这是我的操作过滤器)
public class SecurityRequirementsOperationFilter : IOperationFilter
{
public void Apply(OpenApiOperation operation, OperationFilterContext context)
{
// Policy names map to scopes
var requiredScopes = context.MethodInfo
.GetCustomAttributes(true)
.OfType<AuthorizeAttribute>()
.Select(attr => attr.Policy)
.Distinct();
if (requiredScopes.Any())
{
operation.Responses.Add("401", new OpenApiResponse { Description = "Unauthorised" });
operation.Responses.Add("403", new OpenApiResponse { Description = "Forbidden" });
operation.Security = new List<OpenApiSecurityRequirement>();
var secReq = new List<OpenApiSecurityRequirement>();
operation.Security.Add(new OpenApiSecurityRequirement
{
{
new OpenApiSecurityScheme
{
Description="Adds token to header",
Name="Authorization",
Type=SecuritySchemeType.Http,
In=ParameterLocation.Header,
Scheme = JwtBearerDefaults.AuthenticationScheme,
Reference = new OpenApiReference
{
Type= ReferenceType.SecurityScheme,
Id=JwtBearerDefaults.AuthenticationScheme
}
},new List<string>()
}
});
}
}
}
在这些配置之后,我在控制器中执行正常的 CRUD 操作,这些操作受到保护并需要 JWT Bearer,因此我用
[Athorize]
属性装饰了这些端点,但此外我还有两个端点 - /login 和 /register显然我想让它们公开可用,所以我用 [AllowAnonymus]
属性装饰它们。
这里的问题是生成的 swagger UI 在每个端点上显示挂锁,如下所示 -
如何摆脱公共端点上的这些挂锁?我这里缺少什么配置?
提前致谢
希望您已经解决了这个问题,因为这已经有大约 1 年 6 分钟的历史了。无论如何,你不需要添加 选项.AddSecurityRequirement(new OpenApiSecurityRequirement()... 在您的 Program.cs 上,因为您仍在将其添加到 SecurityRequirementsOperationFilter.cs 过滤器上的授权端点上