C# ASP.NET核心-招摇过市-公共和私有招摇过市页面

C# ASP.NET核心-招摇过市-公共和私有招摇过市页面,c#,asp.net-core,swagger,swagger-ui,swashbuckle,C#,Asp.net Core,Swagger,Swagger Ui,Swashbuckle,我们有一个API,它包含一些我们想公开的端点,还有一些我们不想公开的端点。但是,我不想简单地排除私有端点,我仍然希望它们是可见的,但仅限于某些用户或至少在不同的url下。这似乎应该是相当普遍的,但我很难找到如何做到这一点 目前,我们已经设置并运行了swagger,显示了所有端点。某些控制器使用类似的apipexplorersettings属性标记为“public”组(其中SwaggerGroups.public是字符串常量“public”): [apiplorersettings(GroupNa

我们有一个API,它包含一些我们想公开的端点,还有一些我们不想公开的端点。但是,我不想简单地排除私有端点,我仍然希望它们是可见的,但仅限于某些用户或至少在不同的url下。这似乎应该是相当普遍的,但我很难找到如何做到这一点

目前,我们已经设置并运行了swagger,显示了所有端点。某些控制器使用类似的
apipexplorersettings
属性标记为“public”组(其中
SwaggerGroups.public
是字符串常量“public”):

[apiplorersettings(GroupName=SwaggerGroups.Public)]

理想情况下,我们会有一个显示所有标记为public的控制器/方法的招摇过市页面,以及另一个显示所有端点的密码安全端点。这可能吗?

首先,您的问题听起来好像没有正确地分离API,实际上应该是两个API(MicroService术语中的两个应用程序服务)

因此,您也应该将其视为两个独立的API

services.AddSwaggerGen(c =>
{
    c.SwaggerDoc("public", new OpenApiInfo { Title = "My Public API", Version = "v1" });
    c.SwaggerDoc("private", new OpenApiInfo { Title = "My Private API", Version = "v1" });
});
这将生成两个不同的OpenAPI(招摇过市)规范
/api docs/public/swagger.json
/api docs/private/swagger.json
,可以托管在两个不同的UI应用程序中(一个受保护,另一个公开提供)

另一种方法是使用构建管道/连续集成系统。Swashback.AspNetCore在库的5.x版本中提供了一个cli扩展,可以作为构建脚本的一部分执行,以在构建过程中生成
swagger.json
文件

比如说

dotnet swagger tofile --output ../swagger/myapi/private.json MyCompany.MyApplication.Mvc private
dotnet swagger tofile --output ../swagger/myapi/public.json MyCompany.MyApplication.Mvc public
还有一个像这样的docs应用程序

// Private Docs App
app.UseSwaggerUI(c =>
{
    c.SwaggerEndpoint("http://example.com/api-docs/swagger/myapp/private.json", "Private API");
    c.SwaggerEndpoint("http://example.com/api-docs/swagger/myapp/public.json", "Public API");
});
其中,您使用Webserver手段(nginx、apache、iis)保护“private.json”,即仅允许在内部网络中访问private.json,或仅在身份验证等之后访问private.json

除上述方法外,还可以在同一个应用程序中托管两个文件,但使用中间件保护私有文件,请参阅以获取一些启示

// Private Docs App
app.UseSwaggerUI(c =>
{
    c.SwaggerEndpoint("http://example.com/api-docs/swagger/myapp/private.json", "Private API");
    c.SwaggerEndpoint("http://example.com/api-docs/swagger/myapp/public.json", "Public API");
});