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");
}
我刚刚在我的 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
:
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");
}