我有一个带有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);
});
}
}