我正在使用.Net Core 2.1创建一个API,并使用JSON Web token (JWT)进行身份验证。
我有2个 Controller :AuthenticationController
和UserController
。
我用AuthenticationController
装饰了[AllowAnonymous]
,并用UserController
装饰了[Authorize]
。
Swagger运行正常:它允许我在不请求授权的情况下访问AuthenticationController(SignUp/SignIn)中的端点,并且确实请求JWT在UserController
中命中端点。
但是,在Swagger UI中,每个 Controller 的每个端点都显示一个挂锁图标,好像它们都需要授权一样。一切正常且按预期工作,但令我困扰的是不需要授权的端点仍显示该挂锁图标。
是否可以从这些端点中删除挂锁图标?
我相信OperationFilter
可以完成某些工作,但我找不到办法。
最佳答案
绝对地,您需要使用IOperationFilter
删除匿名端点的挂锁图标。
// AuthResponsesOperationFilter.cs
public class AuthResponsesOperationFilter : IOperationFilter
{
public void Apply(OpenApiOperation operation, OperationFilterContext context)
{
var authAttributes = context.MethodInfo.DeclaringType.GetCustomAttributes(true)
.Union(context.MethodInfo.GetCustomAttributes(true))
.OfType<AuthorizeAttribute>();
if (authAttributes.Any())
{
var securityRequirement = new OpenApiSecurityRequirement()
{
{
// Put here you own security scheme, this one is an example
new OpenApiSecurityScheme
{
Reference = new OpenApiReference
{
Type = ReferenceType.SecurityScheme,
Id = "Bearer"
},
Scheme = "oauth2",
Name = "Bearer",
In = ParameterLocation.Header,
},
new List<string>()
}
};
operation.Security = new List<OpenApiSecurityRequirement> { securityRequirement };
operation.Responses.Add("401", new OpenApiResponse { Description = "Unauthorized" });
}
}
// Startup.cs
services.AddSwaggerGen(c =>
{
...
c.OperationFilter<AuthResponsesOperationFilter>();
};
不要忘记删除
AddSecurityRequirement
中对Startup.cs
的任何调用,否则挂锁图标仍将添加到所有端点。