我大胆地从事多种微服务的工作。 部署到Azure时,由于安全最佳实践,我们需要一起删除所有选项。 使用.net Core 2.1 寻找定义示例。
答案 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>
随便玩,您就会变得博大精深!