WebVenta/WebVentaCoche/Program.cs
2025-04-28 21:42:35 +02:00

107 lines
2.9 KiB
C#

// 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<ApplicationDbContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection"))
.EnableSensitiveDataLogging()
);
//Identity + JWT + Helpers
builder.Services.AddIdentity<User, IdentityRole>(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<ApplicationDbContext>()
.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<IUserHelper, UserHelper>();
builder.Services.AddScoped<VerificationService>();
builder.Services.AddTransient<SeedDb>();
builder.Services.AddTransient<EmailService>();
//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<MappingProfile>();
});
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<SeedDb>();
seeder.SeedAsync().Wait();
}
app.Run();