This commit is contained in:
2026-10-06 17:47:27 +03:30
parent e379faaa07
commit 48395457e6
11 changed files with 606 additions and 84 deletions
+47 -4
View File
@@ -13,6 +13,7 @@ using System.Linq.Expressions;
using IdentityServer4.Extensions;
using xIdentityModels.Extensions;
using Microsoft.EntityFrameworkCore.Query;
using Microsoft.Extensions.Caching.Memory;
namespace xIds.Providers
{
@@ -21,6 +22,7 @@ namespace xIds.Providers
/// </summary>
public partial class XApplicationProvider : IXApplicationProvider
{
private readonly IMemoryCache cache;
private readonly string permittedRole;
private readonly XIdentityDbContext dbContext;
private readonly IXIdentityManager identityManager;
@@ -28,6 +30,7 @@ namespace xIds.Providers
private readonly XApiKeyConfiguration apiKeyConfiguration;
public XApplicationProvider(
IMemoryCache cache,
XIdentityDbContext dbContext,
IXIdentityManager identityManager,
XDataServiceConfiguration configuration,
@@ -36,6 +39,7 @@ namespace xIds.Providers
)
{
//
this.cache = cache;
this.dbContext = dbContext;
this.permittedRole = permittedRole;
this.configuration = configuration;
@@ -190,7 +194,7 @@ namespace xIds.Providers
// Return result ...
return result;
}
/// <summary>
/// Prepare a Queryable of Items ...
/// </summary>
@@ -233,7 +237,7 @@ namespace xIds.Providers
// Return result ...
return result;
}
/// <summary>
/// Prepare a Queryable of Items ...
/// </summary>
@@ -249,7 +253,7 @@ namespace xIds.Providers
{
//
// Global Result ...
var result = dbContext.ApiKeyUsage.AsQueryable();
var result = dbContext.ApiKeyUsages.AsQueryable();
//
// Handle Filtering ...
@@ -275,6 +279,45 @@ namespace xIds.Providers
//
// Return result ...
return result;
}
}
/// <summary>
/// Handle Rate Limit Checking ...
/// </summary>
/// <param name="apiKeyId"></param>
/// <param name="limitPerMinute"></param>
/// <returns></returns>
private bool CheckRateLimit(
Guid apiKeyId,
int limitPerMinute
)
{
//
var cacheKey = $"ratelimit:{apiKeyId}";
var currentCount = cache.GetOrCreate(
cacheKey,
entry =>
{
//
entry.SlidingExpiration = TimeSpan.FromMinutes(1);
return 0;
}
);
//
if (currentCount >= limitPerMinute) {
return false;
}
//
cache.Set(
cacheKey,
currentCount + 1,
TimeSpan.FromMinutes(1)
);
//
return true;
}
}
}