using BuildingBlocks.Web; using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.Extensions.DependencyInjection; namespace BuildingBlocks.Jwt; using Duende.IdentityServer.EntityFramework.Entities; using Microsoft.IdentityModel.Tokens; public static class JwtExtensions { public static IServiceCollection AddJwt(this IServiceCollection services) { var jwtOptions = services.GetOptions("Jwt"); services.AddAuthentication(o => { o.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; o.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; }) .AddCookie(cfg => cfg.SlidingExpiration = true) .AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, options => { options.Authority = jwtOptions.Authority; options.TokenValidationParameters = new TokenValidationParameters { ValidateAudience = false, ClockSkew = TimeSpan.FromSeconds(2) // For prevent add default value (5min) to life time token! }; options.RequireHttpsMetadata = jwtOptions.RequireHttpsMetadata; options.MetadataAddress = jwtOptions.MetadataAddress; }); if (!string.IsNullOrEmpty(jwtOptions.Audience)) { services.AddAuthorization(options => options.AddPolicy(nameof(ApiScope), policy => { policy.RequireAuthenticatedUser(); policy.RequireClaim("scope", jwtOptions.Audience); }) ); } return services; } }