所以,我开始使用Swagger。 我非常喜欢它的功能,但我对所有公开方法的可用性都有疑问。
据我所知 - 所有这些都包括在Swaschbuclke" auth"方法实际上是关于API本身,但我不需要帮助 - 我的所有API都受API id /密钥对的保护。
我想以某种方式利用ASP.NET身份(登录系统)来限制对API页面的访问(/ swagger / ui / index)。
有什么办法吗? Swaschbuckle中的任何方法?任何路线/身份黑客?
感谢任何帮助。
编辑1:[ApiExplorerSettings(IgnoreApi = true)]
属性不是我正在寻找的 - 它限制了对方法的所有访问,无论身份如何。
答案 0 :(得分:17)
关于限制您的招摇文档中个别API的曝光:
Swashbuckle 5.x:
Swashbuckle 5.x有一个名为IgnoreObsoleteActions的配置选项(您需要设置;默认情况下不启用),如果它们具有[Obsolete]
属性,则会隐藏操作。
示例:配置
httpConfiguration
.EnableSwagger(c =>
{
c.IgnoreObsoleteActions();
});
documentation中提供了更多信息。
Swashbuckle 4.1.x(或者如果您不想使用过时的属性):
Swashbuckle在IApiExplorer之上构建了一个swagger文档。您应该能够添加一个属性 - [ApiExplorerSettings(IgnoreApi = true)]
- 来管理ApiExplorer设置控制器类或单个控制器方法,以便在生成文档时让资源管理器(以及随后的Swashbuckle)忽略它们。
示例:个别操作
/// Ignore 'GetFoo' in documentation
public class FooBarController
{
[ApiExplorerSettings(IgnoreApi = true)]
public Bar GetFoo
{
...
}
public Bar GetBar
{
...
}
}
示例:控制器类
/// Ignore every controller method in FooBarController in documentation
[ApiExplorerSettings(IgnoreApi = true)]
public class FooBarController
{
public Bar GetFoo
{
...
}
public Bar GetBar
{
...
}
}
此GitHub Issue中的详细信息。我自己在Swashbuckle 4.1.x中使用过它。
答案 1 :(得分:3)
将SwaggerAccessMessageHandler.cs
类添加到您的项目中。
SwaggerAccessMessageHandler.cs:
public class SwaggerAccessMessageHandler : DelegatingHandler
{
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request,
CancellationToken cancellationToken)
{
if (IsSwagger(request))
{
if (!Thread.CurrentPrincipal.Identity.IsAuthenticated)
{
// Unauthorized access to swagger
// do any things like : return Unauthorized or NotFound
var response = request.CreateResponse(HttpStatusCode.Unauthorized);
return Task.FromResult(response);
}
}
return base.SendAsync(request, cancellationToken);
}
private bool IsSwagger(HttpRequestMessage request)
{
return request.RequestUri.PathAndQuery.StartsWith("/swagger");
}
}
在启用Swagger之前,将处理程序添加到SwaggeConfig.cs
(App_start> SwaggeConfig.cs)中:
public class SwaggerConfig
{
public static void Register()
{
// Add here, before EnableSwagger
GlobalConfiguration.Configuration.MessageHandlers.Add(new SwaggerAccessMessageHandler());
GlobalConfiguration.Configuration
.EnableSwagger(/*c => ....*/)
.EnableSwaggerUi(/*c => ....*/);
}
}
最诚挚的问候。
答案 2 :(得分:1)
在项目根目录中创建名为“swagger”的新文件夹。文件夹名称应与swagger文档的URL匹配。
在新创建的文件夹中添加了新的Web.config文件。
<configuration>
<system.web>
<authorization>
<deny users="?" />
</authorization>
</system.web>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true" />
</system.webServer>
</configuration>
回答here。
另一种选择是:
“在我的头脑中,我会说在这里你需要一个DelegatingHandler。”
回答here。