107 lines
2.9 KiB
C#
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();
|