feat(auth): add Redis authorization caching

This commit is contained in:
2026-08-01 12:20:31 +08:00
parent 84c2b0b21d
commit 46abf4d62f
36 changed files with 21757 additions and 35 deletions

View File

@@ -199,8 +199,8 @@ internal static class AuthenticationExtensions
}
}
var sessionStore = context.HttpContext.RequestServices.GetRequiredService<IAuthSessionStore>();
var session = await sessionStore.ValidateAccessSessionAsync(
var accessValidator = context.HttpContext.RequestServices.GetRequiredService<IRequestAccessValidator>();
var session = await accessValidator.ValidateAsync(
sessionId,
userId,
realm.Value,

View File

@@ -39,6 +39,12 @@ public static class DependencyInjection
options => !builder.Environment.IsProduction() || !string.IsNullOrWhiteSpace(options.ConnectionString),
"Redis is required in Production.")
.ValidateOnStart();
builder.Services.AddOptions<AuthorizationCacheOptions>()
.Bind(builder.Configuration.GetSection(AuthorizationCacheOptions.SectionName))
.Validate(options => options.LocalSnapshotSeconds > 0 && options.DistributedStateSeconds > 0 &&
options.DistributedSnapshotSeconds > 0 && options.JitterPercent is >= 0 and <= 50,
"Authorization cache durations must be positive and jitter must be between 0 and 50 percent.")
.ValidateOnStart();
if (!string.IsNullOrWhiteSpace(redisConnectionString))
{
builder.Services.AddRedisSecurity(redisConnectionString, builder.Environment.EnvironmentName);

View File

@@ -2,6 +2,7 @@ using OpenTelemetry.Metrics;
using OpenTelemetry.Resources;
using OpenTelemetry.Trace;
using Tiku.Infrastructure.Observability;
using Tiku.Infrastructure.Security;
namespace Tiku.Api.Configuration;
@@ -28,7 +29,8 @@ internal static class ObservabilityExtensions
.WithMetrics(metrics => metrics
.AddAspNetCoreInstrumentation()
.AddHttpClientInstrumentation()
.AddMeter(DatabasePerformanceTelemetry.MeterName, WorkerTelemetry.MeterName, "Tiku.Security.Redis", "Npgsql")
.AddMeter(DatabasePerformanceTelemetry.MeterName, WorkerTelemetry.MeterName,
AuthorizationCacheTelemetry.MeterName, "Tiku.Security.Redis", "Npgsql")
.ApplyIf(hasOtlpEndpoint, builder => builder.AddOtlpExporter(options => options.Endpoint = endpointUri!)));
return services;