Swagger 和 WebAPI (Swashbuckle) - 使 /swagger 端点私有?

Swagger and WebAPI (Swashbuckle) - making the /swagger endpoint private?

我刚刚在我的 WebAPI 项目中安装了 Swashbuckle,到目前为止一切顺利,尽管 /swagger api 端点是 public。

我只想允许我的移动应用程序开发人员访问。我如何隐藏我的 API 密码或在此处要求表单验证?

如果您的项目托管在 IIS 下,您可以在 IIS 网站上使用 Windows (with proper access rights on site folder) or basic authentication,并禁用匿名身份验证。

@bsoulier 的回答非常合理。另一种方法是使用 JavaScript/AJAX.

我没有尝试保护实际的 swagger-ui 索引页面,因为大多数时候在端点上进行身份验证就足够了。

但是任何 JavaScript 都可以轻松地注入 index 页面,或者您可以使用自己的自定义 index 页面。这意味着您可以使用任何您想要的身份验证。只需创建一个简单的 HTML 表单并使用 AJAX 调用以登录用户,然后再允许他们查看任何内容或将他们重定向到真正的 swagger-ui 页面。

将 JavaScript 文件从 SwaggerConfig:

注入 swagger-ui 页面
c.InjectJavaScript(thisAssembly, "Your.Namespace.testScript1.js");

将自定义索引页面注入 SwaggerConfig 中的 swagger-ui 页面:

c.CustomAsset("index", containingAssembly, "Your.Namespace.index.html");

我通过以下方法实现了这一点:

protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) {
        string username = null;
        if (Thread.CurrentPrincipal.Identity != null && Thread.CurrentPrincipal.Identity.Name != null) {
            username = Thread.CurrentPrincipal.Identity.Name.ToLower();
        }
        if (IsSwagger(request) && username != "Admin") {
            var response = request.CreateResponse(HttpStatusCode.Unauthorized);
            return Task.FromResult(response);
        }
        else {
            return base.SendAsync(request, cancellationToken);
        }
    }

    private bool IsSwagger(HttpRequestMessage request) {
        return request.RequestUri.PathAndQuery.StartsWith("/swagger");
    }