我需要记录一个 Web API。为此,我使用 Swagger。为了保护文档,我使用 RoutePrefix,只有授权人员才能访问,只有知道正确 RoutePrefix 的人(它是一个 guid)。但是任何知道我的应用程序基本路径的人在访问 myapp.com/swagger/v1/swagger.json 时都可以查看内容。我怎样才能保护这个端点?
我尝试过使用中间件,我认为这对我的问题来说有点复杂。
通常swagger不用于生产环境,一般用于开发环境。
我们可以在默认模板中找到
IsDevelopment
条件。
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
我们知道中间件可以捕获所有的http请求,所以我们可以通过识别URL(/swagger/v1/swagger.json)来限制它,这是最简单的方法,并不复杂。
这是给您的样本。
public class SwaggerAuthMiddleware
{
private readonly RequestDelegate _next;
private const string SwaggerEndpoint = "/swagger/v1/swagger.json";
private const string AuthHeaderName = "X-Swagger-Auth-Key";
private const string AuthKey = "YourSecretKey"; // authkey in header
public SwaggerAuthMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext context)
{
if (context.Request.Path.StartsWithSegments(SwaggerEndpoint))
{
if (!context.Request.Headers.TryGetValue(AuthHeaderName, out var extractedAuthKey))
{
context.Response.StatusCode = StatusCodes.Status401Unauthorized;
await context.Response.WriteAsync("Unauthorized access to Swagger documentation.");
return;
}
if (!AuthKey.Equals(extractedAuthKey))
{
context.Response.StatusCode = StatusCodes.Status403Forbidden;
await context.Response.WriteAsync("Forbidden access to Swagger documentation.");
return;
}
}
await _next(context);
}
}