// Program.cs using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.AspNetCore.Identity; using Microsoft.EntityFrameworkCore; using Microsoft.IdentityModel.Tokens; using System.Text; using AutoMapper; using WebVentaCoche.DataBase; using WebVentaCoche.Helpers; using WebVentaCoche.Models; using WebVentaCoche.Services; var builder = WebApplication.CreateBuilder(args); //Configuración de Entity Framework + SQL Server builder.Services.AddDbContext(options => options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")) .EnableSensitiveDataLogging() ); //Identity + JWT + Helpers builder.Services.AddIdentity(opts => { opts.User.RequireUniqueEmail = true; opts.Password.RequireDigit = false; opts.Password.RequireLowercase = false; opts.Password.RequireNonAlphanumeric = false; opts.Password.RequireUppercase = false; opts.Password.RequiredUniqueChars = 0; }) .AddEntityFrameworkStores() .AddDefaultTokenProviders(); builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(opts => { opts.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = false, ValidateAudience = false, ValidateLifetime = true, ValidateIssuerSigningKey = true, IssuerSigningKey = new SymmetricSecurityKey( Encoding.UTF8.GetBytes(builder.Configuration["JWT:SecretToken"]!) ), ClockSkew = TimeSpan.Zero }; }); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddTransient(); builder.Services.AddTransient(); //MVC + Session + Memoria builder.Services.AddControllersWithViews(); builder.Services.AddMemoryCache(); builder.Services.AddSession(opts => { opts.IdleTimeout = TimeSpan.FromMinutes(30); opts.Cookie.HttpOnly = true; // opts.Cookie.SecurePolicy = CookieSecurePolicy.Always; //produccion }); builder.Services.AddAutoMapper(cfg => { cfg.AddProfile(); }); var app = builder.Build(); //Pipeline de middleware if (app.Environment.IsDevelopment()) { // En dev vemos la excepción completa y stack-trace en el navegador app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Home/Error"); app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseSession(); app.UseAuthentication(); app.UseAuthorization(); app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}" ); // 5. (Opcional) Seed de datos using (var scope = app.Services.CreateScope()) { var seeder = scope.ServiceProvider.GetRequiredService(); seeder.SeedAsync().Wait(); } app.Run();