16

所以,我开始使用 Swagger。我绝对爱上了它的功能,但我对所有公开方法的可用性有一些疑问。

据我了解——Swaschbuclke“auth”方法中包含的所有内容实际上都是关于 API 本身的,但我不需要帮助——我所有的 API 都受 API id/key 对的保护。

我想以某种方式利用 ASP.NET 身份(登录系统)来限制对 API 页面(/swagger/ui/index)的访问。

有什么办法吗?Swaschbuckle 中的任何方法?任何路线/身份黑客?

任何帮助表示赞赏。

编辑1:[ApiExplorerSettings(IgnoreApi = true)]属性不是我要找的——它限制了对方法的所有访问,无论身份如何。

4

3 回答 3

24

关于在 Swagger 文档中限制单个 API 的公开:

Swashbuckle 5.x:

Swashbuckle 5.x 有一个名为 IgnoreObsoleteActions 的配置选项(您需要设置它;默认情况下未启用),如果它们具有该[Obsolete]属性,它将隐藏动作。

示例:配置

httpConfiguration
    .EnableSwagger(c =>
        {
            c.IgnoreObsoleteActions();
        });

文档中提供了更多信息。

Swashbuckle 4.1.x(或者如果您不想使用 obsolete 属性):

Swashbuckle 在IApiExplorer之上构建 swagger 文档。您应该能够添加一个属性 -- [ApiExplorerSettings(IgnoreApi = true)]-- 来管理 ApiExplorerSettings 控制器类或单个控制器方法,以使资源管理器(以及随后的 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 问题中的更多详细信息。我自己在 Swashbuckle 4.1.x 中使用过这个。

于 2015-10-16T17:42:38.070 回答
4

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");
    }
}

SwaggeConfig.cs在启用 Swagger 之前,在 (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 => ....*/);

    }
}

最良好的问候。

于 2020-04-06T15:00:35.903 回答
2

在项目根目录中创建了名为“swagger”的新文件夹。文件夹名称应与 swagger 文档的 url 匹配。

在新创建的文件夹中添加了新的 Web.config 文件。

<configuration> 
<system.web> 
<authorization> 
<deny users="?" /> 
</authorization> 
</system.web> 
<system.webServer> 
<modules runAllManagedModulesForAllRequests="true" /> 
</system.webServer> 
</configuration>

答案在这里找到。

另一种选择是:

“在我的脑海中,我会说 DelegatingHandler 是你需要的。”

答案在这里找到。

于 2015-11-13T20:27:26.290 回答