diff --git a/src/Directory.Packages.props b/src/Directory.Packages.props
index 6a86a48..71e0fc5 100644
--- a/src/Directory.Packages.props
+++ b/src/Directory.Packages.props
@@ -4,7 +4,6 @@
-
runtime; build; native; contentfiles; analyzers; buildtransitive
all
@@ -13,4 +12,4 @@
-
\ No newline at end of file
+
diff --git a/src/FiscalOS.API/FiscalOS.API.csproj b/src/FiscalOS.API/FiscalOS.API.csproj
index abc943c..9bf99ec 100644
--- a/src/FiscalOS.API/FiscalOS.API.csproj
+++ b/src/FiscalOS.API/FiscalOS.API.csproj
@@ -1,7 +1,6 @@
-
runtime; build; native; contentfiles; analyzers; buildtransitive
all
diff --git a/src/FiscalOS.Infra/.editorconfig b/src/FiscalOS.Infra/.editorconfig
index 5135c0e..91dc7c3 100644
--- a/src/FiscalOS.Infra/.editorconfig
+++ b/src/FiscalOS.Infra/.editorconfig
@@ -1,3 +1,4 @@
[*.cs]
dotnet_diagnostic.CA1062.severity = none
+dotnet_diagnostic.CA5404.severity = none
diff --git a/src/FiscalOS.Infra/Authentication/JwtOptions.cs b/src/FiscalOS.Infra/Authentication/JwtOptions.cs
index 1ee9187..7d81870 100644
--- a/src/FiscalOS.Infra/Authentication/JwtOptions.cs
+++ b/src/FiscalOS.Infra/Authentication/JwtOptions.cs
@@ -1,3 +1,5 @@
+using Microsoft.AspNetCore.Authentication.JwtBearer;
+
namespace FiscalOS.Infra.Authentication;
public sealed record JwtOptions
@@ -6,6 +8,8 @@ public sealed record JwtOptions
public string Audience { get; init; } = string.Empty;
public string Secret { get; init; } = string.Empty;
public int ExpiryInMinutes { get; init; } = 5;
+
+ public SymmetricSecurityKey Key => new(Encoding.UTF8.GetBytes(Secret));
}
public sealed record JwtOptionsSetup : IConfigureOptions
@@ -22,4 +26,33 @@ public sealed record JwtOptionsSetup : IConfigureOptions
{
_configuration.GetSection(SectionName).Bind(options);
}
+}
+
+public sealed class JwtBearerOptionsSetup(IOptions jwtOptions) : IConfigureNamedOptions
+{
+ private readonly JwtOptions _jwtOptions = jwtOptions.Value;
+
+ public void Configure(string? name, JwtBearerOptions options)
+ {
+ options.TokenValidationParameters = new()
+ {
+ ValidIssuer = _jwtOptions.Issuer,
+ ValidAudience = _jwtOptions.Audience,
+ IssuerSigningKey = _jwtOptions.Key,
+ ValidateIssuer = true,
+ ValidateAudience = true,
+ ValidateIssuerSigningKey = true,
+ ValidateLifetime = true,
+ };
+
+ if (name is Schemes.AllowExpiredTokens)
+ {
+ options.TokenValidationParameters.ValidateLifetime = false;
+ }
+ }
+
+ public void Configure(JwtBearerOptions options)
+ {
+ Configure(Options.DefaultName, options);
+ }
}
\ No newline at end of file
diff --git a/src/FiscalOS.Infra/DependencyInjection/ServiceCollectionExtensions.cs b/src/FiscalOS.Infra/DependencyInjection/ServiceCollectionExtensions.cs
index e5754c2..2b5ea40 100644
--- a/src/FiscalOS.Infra/DependencyInjection/ServiceCollectionExtensions.cs
+++ b/src/FiscalOS.Infra/DependencyInjection/ServiceCollectionExtensions.cs
@@ -5,12 +5,17 @@ public static class ServiceCollectionExtensions
public static IServiceCollection AddInfrastructure(this IServiceCollection services)
{
services.AddSingleton(TimeProvider.System);
+
services.ConfigureOptions();
+ services.ConfigureOptions();
+
services.AddSingleton(TokenGenerator.From);
services.AddSingleton(PasswordHasher.From);
+
services.ConfigureOptions();
services.AddDbContext();
services.AddHostedService();
+
return services;
}
}
\ No newline at end of file