Les rapports sont très courants dans n'importe quel système et certains d'entre eux peuvent être très lourds à traiter. Par conséquent, dans ce cas, l'application peut être dégradée lors de la génération du rapport, affectant les autres utilisateurs. Mais comment pouvons-nous éviter cela? La première pensée serait de bloquer le fond, non? Um, mais c'est si facile à pirater, l'utilisateur peut simplement modifier les accessoires HTML et l'activer à nouveau. Par conséquent, la meilleure option consiste à le bloquer du côté serveur, en utilisant une stratégie de contrôle de limite de demande.
AspNetCoreRateLimit est une bibliothèque qui peut nous aider avec le contrôle de la demande. Vous pouvez définir des règles pour décider combien de fois un client peut appeler la ressource sur une période de temps.
Mais comment ça marche?
ASPNetCoreraTelimit utilise la solution MemoryCache pour enregistrer des informations sur les demandes du client. Par exemple, un client ne peut faire que 10 demandes dans un intervalle de 5 secondes pour un point de terminaison spécifique. Ainsi, chaque demande sera enregistrée dans le cache de mémoire et si le client dépasse cette limite, l'application arrêtera la demande et renvoie un statut d'erreur HTTP.
Tout d'abord, nous devons installer la bibliothèque aspnetcoreratelimit
La meilleure option pour configurer ASPNetCoreraRatelimit est de définir toutes les informations dans AppSettings.json. Nous allons donc créer un bloc comme ceci:
"IpRateLimiting": {
"EnableEndpointRateLimiting": true,
"StackBlockedRequests": false,
"RealIpHeader": "X-Real-IP",
"ClientIdHeader": "X-ClientId",
"HttpStatusCode": 429,
"GeneralRules": [
{
"Endpoint": "*/api/test",
"Period": "2s", //interval
"Limit": 2 //limit of request in the interval
}
]
},
Avec nos règles configurées, nous devons ajouter quelques lignes dans Startup.cs :
public void ConfigureServices(IServiceCollection services)
{
services.AddOptions();
//AspNetCoreRateLimit uses MemoryCache to control the numbers of requests
services.AddMemoryCache();
//Adding AspNetCoreRateLimit rules
services.Configure<IpRateLimitOptions>(Configuration.GetSection("IpRateLimiting"));
//Adding the store
services.AddSingleton<IIpPolicyStore, MemoryCacheIpPolicyStore>();
//Adding the request counter
services.AddSingleton<IRateLimitCounterStore, MemoryCacheRateLimitCounterStore>();
services.AddSingleton<IRateLimitConfiguration, RateLimitConfiguration>();
services.AddHttpContextAccessor();
services.AddControllers();
services.AddSingleton<IRateLimitConfiguration, RateLimitConfiguration>();
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo { Title = "RequestLimit", Version = "v1" });
});
}
Et la dernière étape consiste à activer le service:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseSwagger();
app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "RequestLimit v1"));
}
app.UseHttpsRedirection();
app.UseRouting();
app.UseIpRateLimiting() //Adding this block;
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
Et c'est fait, maintenant notre API a un contrôle de la demande. Vous pouvez personnaliser votre configuration pour suivre les règles des spécificités, toutes les options sont répertoriées ici: https://github.com/stefanprodan/aspnetcoreratelimit