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)}"; + } } } 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 diff --git a/test/AspNetCoreRateLimit.Demo/Startup.cs b/test/AspNetCoreRateLimit.Demo/Startup.cs index d91376a2..e5c668b5 100644 --- a/test/AspNetCoreRateLimit.Demo/Startup.cs +++ b/test/AspNetCoreRateLimit.Demo/Startup.cs @@ -28,12 +28,15 @@ 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.AddRedisRateLimiting(); + // 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:" } }