如何删除昂首阔步的生产.NET Core 2.1

时间:2019-03-07 14:48:02

标签: swagger asp.net-core-2.0 swagger-ui

我大胆地从事多种微服务的工作。 部署到Azure时,由于安全最佳实践,我们需要一起删除所有选项。 使用.net Core 2.1 寻找定义示例。

4 个答案:

答案 0 :(得分:3)

如果您来自.net core 3.1:

假设Startup类的构造函数将注入的IConfiguration复制到名为configuration的本地字段中,则可以像下面这样设置Configure方法:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    var applicationName = Configuration.GetValue<string>("ApplicationName") ?? "MyApi";
    var basePath = Configuration.GetValue<string>("BasePath");
    if (!string.IsNullOrEmpty(basePath))
        app.UsePathBase(basePath);

    if (!env.IsProduction())
    {
        app.UseSwagger();
        app.UseSwaggerUI(c =>
        {
            c.SwaggerEndpoint($"{basePath}/swagger/v1/swagger.json",
                                $"{applicationName} {ReflectionUtils.GetAssemblyVersion<Program>()}");
        });
    }
}

答案 1 :(得分:1)

首先,什么是“安全最佳实践”?在生产环境中使用API​​文档没有任何问题。实际上,这很重要:客户应该能够查看文档,以便他们可以正确使用您的API。如果这些微服务不会公开供外部客户端使用,那么问题就更少了,因为无论如何,外界都无法获得服务。如果公开了这些服务,那么它们还应该要求对请求进行授权,并且可以通过相同的机制来锁定文档本身。

无论如何,如果您坚持在生产中删除它,那么最好的选择是永远不要将其添加到第一位。换句话说,将所有Swagger设置都用Startup.cs包装在if (env.IsDevelopment())中,或者如果您希望在临时环境if (!env.IsProduction())中使用它,请使用它。

答案 2 :(得分:0)

您也可以在不想在文档中显示的控制器类中使用[ApiExplorerSettings(IgnoreApi = true)]。这是一个排除动作,这意味着将显示每个类,但带有此属性标记的类除外。 (当您只想让第三方消费者看到一组API文档时,这很好);

答案 3 :(得分:0)

第一个选项,在“配置”方法中将其禁用,例如:

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        var config = (IConfiguration)app.ApplicationServices.GetService(typeof(IConfiguration));

        enableSwagger = bool.Parse(config.GetValue<string>("EnableSwagger") ?? "false");

        // read from config
        if (enableSwagger /*|| env.IsDevelopment()*/)
        {
            app.UseSwagger(o =>
            {
                o.RouteTemplate = "swagger/{documentName}/swagger.json";
            });

            // Enable middleware to serve swagger-ui (HTML, JS, CSS, etc.),
            // specifying the Swagger JSON endpoint.
            app.UseSwaggerUI(c =>
            {
                c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1");
            });
        }
    }

或使用:

if (env.IsDevelopment())
{
   ...
}

第二个选项是完全删除代码文件中的所有引用并使用

#if USE_SWAGGER
using Microsoft.OpenApi.Models;
...
#endif

#if USE_SWAGGER
<some method>
...
#endif

添加.csproj:

<Choose>
  <When Condition="$(DefineConstants.Contains('USE_SWAGGER'))">
    <ItemGroup Condition="'$(TargetFramework)' == 'netstandard3.1'">
    <PackageReference Include="Swashbuckle.AspNetCore.Swagger" Version="5.6.3" />
    <PackageReference Include="Swashbuckle.AspNetCore.SwaggerGen" Version="5.6.3" />
    <PackageReference Include="Swashbuckle.AspNetCore.SwaggerUI" Version="5.6.3" />
    </ItemGroup>
  </When>
  <Otherwise />
</Choose>

<Choose>
  <When Condition="'$(Configuration)' == 'Debug'">
    <ItemGroup Condition="'$(TargetFramework)' == 'netstandard3.1'">
    <PackageReference Include="Swashbuckle.AspNetCore.Swagger" Version="5.6.3" />
    <PackageReference Include="Swashbuckle.AspNetCore.SwaggerGen" Version="5.6.3" />
    <PackageReference Include="Swashbuckle.AspNetCore.SwaggerUI" Version="5.6.3" />
    </ItemGroup>
  </When>
  <Otherwise />
</Choose>

随便玩,您就会变得博大精深!