using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.AspNetCore.Builder.Extensions; using Microsoft.AspNetCore.Identity; using Microsoft.EntityFrameworkCore; using Microsoft.IdentityModel.Logging; using Microsoft.IdentityModel.Tokens; using Microsoft.OpenApi.Models; using NodaTime; using Resourcia.Api.BackgroundWorkers; using Resourcia.Api.Options; using Resourcia.Api.Services; using Resourcia.Api.Services.Interfaces; using Resourcia.Api.Utils; using Resourcia.Data; using Resourcia.Data.Entities.Identity; using System; using System.Text; namespace Resourcia.Api; public class Program { public static void Main(string[] args) { Microsoft.IdentityModel.Logging.IdentityModelEventSource.ShowPII = true; IdentityModelEventSource.LogCompleteSecurityArtifact = true; var builder = WebApplication.CreateBuilder(args); var connectionString = builder.Configuration.GetConnectionString("DefaultConnection"); builder.Services.AddDbContext(options => { options.UseNpgsql(connectionString, builder => { builder.UseNodaTime(); }); }); builder.Services.AddIdentityCore(options => options.SignIn.RequireConfirmedAccount = true).AddEntityFrameworkStores().AddSignInManager().AddDefaultTokenProviders(); builder.Services.Configure(options => { options.Password.RequireDigit = true; options.Password.RequireLowercase = true; options.Password.RequireNonAlphanumeric = true; options.Password.RequireUppercase = true; options.Password.RequiredLength = 8; options.Password.RequiredUniqueChars = 1; }); builder.Services.Configure(builder.Configuration.GetSection(nameof(JwtSettings))); var jwtSettings = builder.Configuration.GetRequiredSection(nameof(JwtSettings)).Get(); builder.Services.AddAuthentication(options => { options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; }).AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidateAudience = true, ValidateLifetime = true, ValidateIssuerSigningKey = true, IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtSettings.SecretKey)), ValidIssuer = jwtSettings.Issuer, ValidAudience = jwtSettings.Audience }; options.Events = new JwtBearerEvents { OnAuthenticationFailed = context => { Console.WriteLine($"Authentication failed: {context.Exception.Message}"); return Task.CompletedTask; }, OnTokenValidated = context => { Console.WriteLine("Token validated successfully!"); return Task.CompletedTask; } }; }); builder.Services.AddAuthorization(); // Add services to the container. builder.Services.Configure(builder.Configuration.GetSection("SmtpSettings")); builder.Services.Configure(builder.Configuration.GetSection("EnvironmentSettings")); builder.Services.Configure(builder.Configuration.GetSection("CloudflareSettings")); // Add services to the container. builder.Services.AddScoped(); builder.Services.AddSingleton(SystemClock.Instance); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddHttpClient(); // You can also use the following code to register the EnvironmentOptions class if you have using IOptions envSettings in the AuthController. //builder.Services.AddScoped(); builder.Services.AddHostedService(); builder.Services.AddControllers(); builder.Services.AddSwaggerGen(options => { options.SwaggerDoc("v1", new OpenApiInfo { Title = "JWT API", Version = "v1" }); // Configure JWT Authentication in Swagger options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme { Name = "Authorization", Type = SecuritySchemeType.Http, Scheme = "bearer", BearerFormat = "JWT", In = ParameterLocation.Header, Description = "Enter your JWT token without the 'Bearer' prefix.\n\nExample: abc123xyz" }); options.AddSecurityRequirement(new OpenApiSecurityRequirement { { new OpenApiSecurityScheme { Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id = "Bearer" } }, Array.Empty() } }); }); // Learn more about configuring OpenAPI at https://aka.ms/aspnet/openapi builder.Services.AddOpenApi(); var app = builder.Build(); // Configure the HTTP request pipeline. if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(); } //app.UseHttpsRedirection(); app.UseAuthentication(); app.UseAuthorization(); app.MapControllers(); app.Run(); } }