使用api-key限制Swagger .net Core中的某些终结点

时间:2019-03-06 11:56:06

标签: c# api swagger

我有一个带有apicontrollers EF的net core 2.2项目,并且我将最新的swashbuckle swagger用于net core 4.0.1

它已经设置好,一切都正常,它以大张旗鼓地显示了来自控制器的所有api端点。

问题:我们想通过使用请求标头中的api-key来保护此api。例如,我们希望用户A仅使用usercontroller中的/ GetAllUsers,但是用户B可以看到usercontroller中的所有api端点。

我还没有找到执行此操作的示例。

这是我的想法。 方案1:用户A转到api地址并提示输入用户名和密码(密码为apikey),然后我们检查数据库是否存在匹配的用户名和密码。如果是这样,我们会将用户定向到该用户有权访问的全景视图/端点。

方案二:在标头中发送apikey,然后我们检查数据库并返回正确的视图。

这可行吗?

这是我的创业公司的样子,这是我在其中进行配置的swagger / startup的扩展方法。

启动:

public void ConfigureServices(IServiceCollection services)
{
 services.AddUnitOfWork();
 services.AddHelpers();

 services.AddTransient(typeof(IPipelineBehavior<,>), 
 typeof(RequestValidationBehavior<,>));
 services.AddMediatR();
 services.AddConfiguredSwagger(); // <--- extension
 services.AddMvc()
 .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}

// This method gets called by the runtime. Use this method to configure 
the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();

 // Enable middleware to serve generated Swagger as a JSON endpoint.
app.UseSwagger();
}


// Enable middleware to serve swagger-ui (HTML, JS, CSS, etc.), 
// specifying the Swagger JSON endpoint.
app.UseSwaggerUI(options =>
{
options.SwaggerEndpoint("/swagger/v1/swagger.json", 
typeof(Startup).Namespace);
options.RoutePrefix = string.Empty;
});

app.UseMvc();

app.Run(async (context) =>
{
await context.Response.WriteAsync("Hello");
});
}

扩展名

public static class SwaggerServiceCollectionExtensions
{
public static IServiceCollection AddConfiguredSwagger(this 
IServiceCollection services)
{
    // Register the Swagger generator, defining 1 or more Swagger documents
    return services.AddSwaggerGen(options =>
    {
        options.SwaggerDoc("v1", new Info { Title = 
        typeof(Startup).Namespace, Version = "v1" });
        var xmlFile = $" 
    {Assembly.GetExecutingAssembly().GetName().Name}.xml";
        var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);

        options.IncludeXmlComments(xmlPath);
    });
 }
}

0 个答案:

没有答案