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