Arreglado fallo de aunteticación y agregado endpoint de subir archivo (sin probar)

This commit is contained in:
2025-12-17 12:32:27 +01:00
parent ffc1557074
commit e15c0bcd8f
10 changed files with 339 additions and 65 deletions

View File

@@ -1,32 +1,130 @@
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.IdentityModel.Tokens;
using System.Text;
using Microsoft.OpenApi.Models;
using System.Reflection;
using System.Text.Json.Serialization;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
// 1. Configuraci<63>n de Servicios
// a. Configurar servicios de controladores
builder.Services.AddControllers()
.AddJsonOptions(options =>
.ConfigureApiBehaviorOptions(options =>
{
options.SuppressModelStateInvalidFilter = true; // Desactiva la validaci<63>n autom<6F>tica del estado del modelo
})
.AddJsonOptions(options =>
{
options.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.IgnoreCycles;
});
// b. Configuraci<63>n de JWT
var jwtSettings = builder.Configuration.GetSection("Jwt");
var keyString = jwtSettings["Key"];
if (string.IsNullOrEmpty(keyString))
{
throw new ArgumentNullException("JWT Key is not configured.");
}
var key = Encoding.UTF8.GetBytes(keyString);
builder.Services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
options.JsonSerializerOptions.ReferenceHandler =
System.Text.Json.Serialization.ReferenceHandler.IgnoreCycles;
ValidateIssuer = true,
ValidIssuer = jwtSettings["Issuer"],
ValidateAudience = true,
ValidAudience = jwtSettings["Audience"],
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtSettings["Key"])),
ValidAlgorithms = new[] { SecurityAlgorithms.HmacSha256 }
};
options.Events = new JwtBearerEvents
{
OnAuthenticationFailed = ctx =>
{
var logger = ctx.HttpContext.RequestServices.GetRequiredService<ILogger<Program>>();
logger.LogError("NOMBRE FALLO {0}", ctx.Exception.GetType().Name);
logger.LogError("MENSAJE FALLO {0}", ctx.Exception.Message);
return Task.CompletedTask;
},
};
});
// d. Configurar Swagger con soporte para JWT
builder.Services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo { Title = "SwaggerCamcue API", Version = "v1" });
// Definir el esquema de seguridad JWT
var securityScheme = new OpenApiSecurityScheme
{
Name = "Authorization",
Description = "Ingrese 'Bearer' seguido de su token en el campo de texto.\n\nEjemplo: 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6...'",
In = ParameterLocation.Header,
Type = SecuritySchemeType.Http,
Scheme = "Bearer",
BearerFormat = "JWT"
};
c.AddSecurityDefinition("Bearer", securityScheme);
c.AddSecurityRequirement(new OpenApiSecurityRequirement
{
{
new OpenApiSecurityScheme
{
Reference = new OpenApiReference
{
Type = ReferenceType.SecurityScheme,
Id = "Bearer"
}
},
Array.Empty<string>()
}
});
});
var app = builder.Build();
// Configure the HTTP request pipeline.
// 2. Configuraci<EFBFBD>n del Pipeline HTTP
// b. Habilitar Swagger solo en Desarrollo
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("/swagger/v1/swagger.json", "SwaggerCamcue API V1");
c.RoutePrefix = string.Empty; // Swagger en la ra<72>z
});
}
app.UseHttpsRedirection();
app.UseCors(policy =>
{
policy.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader();
});
//app.UseHttpsRedirection();
// d. Autenticaci<63>n y Autorizaci<63>n
app.UseAuthentication();
app.UseAuthorization();
// e. Mapear Controladores
app.MapControllers();
// f. Ejecutar la Aplicaci<63>n
app.Run();