Skip to content

Commit d67b434

Browse files
committed
Added cache to HMACSHA256UrlSignature
1 parent 7de3f45 commit d67b434

File tree

3 files changed

+25
-5
lines changed

3 files changed

+25
-5
lines changed

src/ImageWizard.Client/Extensions.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ public static IServiceCollection AddImageWizardClient(this IServiceCollection se
2929
services.AddTransient<IImageWizardUrlBuilder, UrlBuilder>();
3030

3131
services.AddSingleton<IUrlSignature, HMACSHA256UrlSignature>();
32-
3332
services.AddSingleton<IActionContextAccessor, ActionContextAccessor>();
3433
services.AddScoped<IUrlHelper>(x =>
3534
{

src/ImageWizard.Core/Middlewares/ImageWizardExtensions.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,8 @@ public static IImageWizardBuilder AddImageWizard(this IServiceCollection service
8080
services.AddTransient<ICache, OneTimeCache>();
8181
services.AddTransient<ICacheKey, SHA256CacheKey>();
8282
services.AddTransient<ICacheHash, SHA256CacheHash>();
83-
services.AddTransient<IUrlSignature, HMACSHA256UrlSignature>();
83+
84+
services.AddSingleton<IUrlSignature, HMACSHA256UrlSignature>();
8485

8586
services.AddTransient<InterceptorInvoker>();
8687

src/ImageWizard.Utils/Signature/HMACSHA256UrlSignature.cs

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,13 @@
44

55
using Microsoft.AspNetCore.Http;
66
using Microsoft.AspNetCore.WebUtilities;
7+
using Microsoft.Extensions.Caching.Memory;
8+
using Microsoft.Extensions.Options;
79
using System;
8-
using System.Buffers;
910
using System.Collections.Generic;
1011
using System.Linq;
1112
using System.Security.Cryptography;
1213
using System.Text;
13-
using System.Threading.Tasks;
1414

1515
namespace ImageWizard.Utils;
1616

@@ -29,6 +29,8 @@ public HMACSHA256UrlSignature(bool includeHost)
2929
IncludeHost = includeHost;
3030
}
3131

32+
private IMemoryCache _cache = new MemoryCache(Options.Create(new MemoryCacheOptions() { SizeLimit = 10_000 }));
33+
3234
/// <summary>
3335
/// Signature depend on remote hostname? (Default: false)
3436
/// </summary>
@@ -73,6 +75,15 @@ public string Encrypt(byte[] key, ImageWizardRequest request)
7375
input = GetUrlValue(request.Url);
7476
}
7577

78+
//signature already exists in cache?
79+
if (_cache.TryGetValue(input, out string? cachedKey) == true)
80+
{
81+
if (cachedKey != null)
82+
{
83+
return cachedKey;
84+
}
85+
}
86+
7687
int inputLength = Encoding.UTF8.GetByteCount(input);
7788

7889
Span<byte> inputBuffer = inputLength <= 128 ? stackalloc byte[inputLength] : new byte[inputLength];
@@ -86,6 +97,15 @@ public string Encrypt(byte[] key, ImageWizardRequest request)
8697
HMACSHA256.HashData(key, inputBuffer, hashBuffer);
8798

8899
//convert to Base64Url
89-
return WebEncoders.Base64UrlEncode(hashBuffer);
100+
string keyBase64Url = WebEncoders.Base64UrlEncode(hashBuffer);
101+
102+
//add signature to cache
103+
_cache.Set(input, keyBase64Url, new MemoryCacheEntryOptions()
104+
{
105+
Size = 1,
106+
SlidingExpiration = TimeSpan.FromHours(1)
107+
});
108+
109+
return keyBase64Url;
90110
}
91111
}

0 commit comments

Comments
 (0)