From df757a30b600e8134ecc55aa9781c7c0407e2395 Mon Sep 17 00:00:00 2001 From: Jacob Stein Date: Tue, 22 Mar 2022 16:25:59 -0400 Subject: [PATCH 1/4] feat: add RedisRateLimitOptions --- src/AspNetCoreRateLimit.Redis/RedisRateLimitOptions.cs | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 src/AspNetCoreRateLimit.Redis/RedisRateLimitOptions.cs diff --git a/src/AspNetCoreRateLimit.Redis/RedisRateLimitOptions.cs b/src/AspNetCoreRateLimit.Redis/RedisRateLimitOptions.cs new file mode 100644 index 00000000..d6d6f7b2 --- /dev/null +++ b/src/AspNetCoreRateLimit.Redis/RedisRateLimitOptions.cs @@ -0,0 +1,10 @@ +namespace AspNetCoreRateLimit.Redis +{ + public class RedisRateLimitOptions + { + /// + /// Gets or sets the Redis key prefix + /// + public string KeyPrefix { get; set; } = "ratelimits:"; + } +} \ No newline at end of file From 98b91523ef0bba74498fa27406033bd1359390dd Mon Sep 17 00:00:00 2001 From: Jacob Stein Date: Tue, 22 Mar 2022 16:26:42 -0400 Subject: [PATCH 2/4] feat(Redis): build key using KeyPrefix --- .../RedisProcessingStrategy.cs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/AspNetCoreRateLimit.Redis/RedisProcessingStrategy.cs b/src/AspNetCoreRateLimit.Redis/RedisProcessingStrategy.cs index ff97be59..fc65e697 100644 --- a/src/AspNetCoreRateLimit.Redis/RedisProcessingStrategy.cs +++ b/src/AspNetCoreRateLimit.Redis/RedisProcessingStrategy.cs @@ -3,6 +3,7 @@ using System; using System.Threading; using System.Threading.Tasks; +using Microsoft.Extensions.Options; namespace AspNetCoreRateLimit.Redis { @@ -10,13 +11,15 @@ public class RedisProcessingStrategy : ProcessingStrategy { private readonly IConnectionMultiplexer _connectionMultiplexer; private readonly IRateLimitConfiguration _config; + private readonly RedisRateLimitOptions _options; private readonly ILogger _logger; - public RedisProcessingStrategy(IConnectionMultiplexer connectionMultiplexer, IRateLimitConfiguration config, ILogger logger) + public RedisProcessingStrategy(IConnectionMultiplexer connectionMultiplexer, IRateLimitConfiguration config, IOptions redisOptions, ILogger logger) : base(config) { _connectionMultiplexer = connectionMultiplexer ?? throw new ArgumentException("IConnectionMultiplexer was null. Ensure StackExchange.Redis was successfully registered"); _config = config; + _options = redisOptions.Value; _logger = logger; } @@ -42,5 +45,11 @@ public async Task IncrementAsync(string counterId, TimeSpan in Timestamp = intervalStart }; } + + protected override string BuildCounterKey(ClientRequestIdentity requestIdentity, RateLimitRule rule, ICounterKeyBuilder counterKeyBuilder, + RateLimitOptions rateLimitOptions) + { + return $"{_options.KeyPrefix}{base.BuildCounterKey(requestIdentity, rule, counterKeyBuilder, rateLimitOptions)}"; + } } } From 8d68132de5889a633fd1862622c359474609a621 Mon Sep 17 00:00:00 2001 From: Jacob Stein Date: Tue, 22 Mar 2022 16:27:22 -0400 Subject: [PATCH 3/4] feat: update demo project --- test/AspNetCoreRateLimit.Demo/Startup.cs | 5 ++++- test/AspNetCoreRateLimit.Demo/appsettings.json | 4 ++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/test/AspNetCoreRateLimit.Demo/Startup.cs b/test/AspNetCoreRateLimit.Demo/Startup.cs index d91376a2..2f58adfa 100644 --- a/test/AspNetCoreRateLimit.Demo/Startup.cs +++ b/test/AspNetCoreRateLimit.Demo/Startup.cs @@ -28,11 +28,14 @@ public void ConfigureServices(IServiceCollection services) // configure client rate limiting middleware services.Configure(Configuration.GetSection("ClientRateLimiting")); services.Configure(Configuration.GetSection("ClientRateLimitPolicies")); + + // configure Redis rate limiting strategy + services.Configure(Configuration.GetSection("RedisRateLimitPolicies")); // register stores services.AddInMemoryRateLimiting(); //services.AddDistributedRateLimiting(); - //services.AddDistributedRateLimiting(); + // services.AddDistributedRateLimiting(); //services.AddRedisRateLimiting(); services.AddMvc((options) => diff --git a/test/AspNetCoreRateLimit.Demo/appsettings.json b/test/AspNetCoreRateLimit.Demo/appsettings.json index 8c587347..cd448f2a 100644 --- a/test/AspNetCoreRateLimit.Demo/appsettings.json +++ b/test/AspNetCoreRateLimit.Demo/appsettings.json @@ -216,5 +216,9 @@ ] } ] + }, + + "RedisRateLimitPolicies": { + "KeyPrefix": "ratelimits:" } } From 9dced6a4bdd9228847388513b713d273240a05ae Mon Sep 17 00:00:00 2001 From: Jacob Stein Date: Tue, 22 Mar 2022 16:29:24 -0400 Subject: [PATCH 4/4] style: consistent comments --- test/AspNetCoreRateLimit.Demo/Startup.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/AspNetCoreRateLimit.Demo/Startup.cs b/test/AspNetCoreRateLimit.Demo/Startup.cs index 2f58adfa..e5c668b5 100644 --- a/test/AspNetCoreRateLimit.Demo/Startup.cs +++ b/test/AspNetCoreRateLimit.Demo/Startup.cs @@ -34,9 +34,9 @@ public void ConfigureServices(IServiceCollection services) // register stores services.AddInMemoryRateLimiting(); - //services.AddDistributedRateLimiting(); + // services.AddDistributedRateLimiting(); // services.AddDistributedRateLimiting(); - //services.AddRedisRateLimiting(); + // services.AddRedisRateLimiting(); services.AddMvc((options) => {