使用Swashbuckle和ASP.NET Identity限制对Swagger中某些API控制器的访问

时间:2015-10-16 17:33:09

标签: asp.net asp.net-identity swagger swagger-ui swashbuckle

所以,我开始使用Swagger。 我非常喜欢它的功能,但我对所有公开方法的可用性都有疑问。

据我所知 - 所有这些都包括在Swaschbuclke" auth"方法实际上是关于API本身,但我不需要帮助 - 我的所有API都受API id /密钥对的保护。

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

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

感谢任何帮助。

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

3 个答案:

答案 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