Ajustes copia RDLC y variables de entorno.
All checks were successful
Build and Deploy / remote-build-and-deploy (push) Successful in 21m46s
All checks were successful
Build and Deploy / remote-build-and-deploy (push) Successful in 21m46s
This commit is contained in:
@@ -64,6 +64,7 @@ jobs:
|
|||||||
cd /opt/gestion-integral
|
cd /opt/gestion-integral
|
||||||
# Gitea reemplaza los secretos aquí. Es seguro.
|
# Gitea reemplaza los secretos aquí. Es seguro.
|
||||||
export DB_SA_PASSWORD='${{ secrets.DB_SA_PASSWORD_SECRET }}'
|
export DB_SA_PASSWORD='${{ secrets.DB_SA_PASSWORD_SECRET }}'
|
||||||
|
export JWT_KEY='${{ secrets.JWT_KEY_SECRET }}'
|
||||||
docker compose up -d
|
docker compose up -d
|
||||||
|
|
||||||
# --- PARTE 4: LIMPIEZA (EN EL HOST) ---
|
# --- PARTE 4: LIMPIEZA (EN EL HOST) ---
|
||||||
|
|||||||
@@ -17,4 +17,12 @@
|
|||||||
<PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="8.9.0" />
|
<PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="8.9.0" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<!-- Esto le dice a MSBuild que busque todos los archivos .rdlc -->
|
||||||
|
<Content Include="Controllers\Reportes\RDLC\**\*.rdlc">
|
||||||
|
<!-- Esto asegura que los archivos se copien a la carpeta de publicación -->
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</Content>
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
@@ -93,15 +93,62 @@ builder.Services.AddScoped<IReportesRepository, ReportesRepository>();
|
|||||||
// Servicios de Reportes
|
// Servicios de Reportes
|
||||||
builder.Services.AddScoped<IReportesService, ReportesService>();
|
builder.Services.AddScoped<IReportesService, ReportesService>();
|
||||||
|
|
||||||
|
|
||||||
|
// --- INICIO DE CAMBIOS: Configuración de Autenticación JWT ---
|
||||||
|
|
||||||
|
// 1. Obtener la sección de configuración de JWT.
|
||||||
|
// Esto leerá desde appsettings.json y SOBRESCRIBIRÁ con variables de entorno si existen.
|
||||||
|
var jwtSection = builder.Configuration.GetSection("JwtSettings");
|
||||||
|
var jwtKey = jwtSection["Key"];
|
||||||
|
var jwtIssuer = jwtSection["Issuer"];
|
||||||
|
var jwtAudience = jwtSection["Audience"];
|
||||||
|
|
||||||
|
// 2. Validar que todas las configuraciones necesarias existan.
|
||||||
|
if (string.IsNullOrEmpty(jwtKey) || string.IsNullOrEmpty(jwtIssuer) || string.IsNullOrEmpty(jwtAudience))
|
||||||
|
{
|
||||||
|
throw new InvalidOperationException("La configuración de JWT (Key, Issuer, Audience) no está completa. Verifique appsettings.json o las variables de entorno.");
|
||||||
|
}
|
||||||
|
|
||||||
|
var keyBytes = Encoding.ASCII.GetBytes(jwtKey);
|
||||||
|
|
||||||
|
builder.Services.AddAuthentication(options =>
|
||||||
|
{
|
||||||
|
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
|
||||||
|
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
|
||||||
|
options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
|
||||||
|
})
|
||||||
|
.AddJwtBearer(options =>
|
||||||
|
{
|
||||||
|
// Es buena práctica usar HTTPS en producción. Si tu proxy inverso maneja SSL, esto puede ser false.
|
||||||
|
options.RequireHttpsMetadata = builder.Environment.IsProduction();
|
||||||
|
options.SaveToken = true;
|
||||||
|
options.TokenValidationParameters = new TokenValidationParameters
|
||||||
|
{
|
||||||
|
ValidateIssuerSigningKey = true,
|
||||||
|
IssuerSigningKey = new SymmetricSecurityKey(keyBytes),
|
||||||
|
|
||||||
|
ValidateIssuer = true,
|
||||||
|
ValidIssuer = jwtIssuer, // Usar la variable leída de la configuración
|
||||||
|
|
||||||
|
ValidateAudience = true,
|
||||||
|
ValidAudience = jwtAudience, // Usar la variable leída de la configuración
|
||||||
|
|
||||||
|
ValidateLifetime = true,
|
||||||
|
ClockSkew = TimeSpan.Zero
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
// --- Configuración de Autenticación JWT ---
|
// --- Configuración de Autenticación JWT ---
|
||||||
var jwtSettings = builder.Configuration.GetSection("Jwt");
|
|
||||||
|
/*var jwtSettings = builder.Configuration.GetSection("Jwt");
|
||||||
|
|
||||||
// Le decimos que busque la clave JWT en la raíz de la configuración (donde están las variables de entorno).
|
// Le decimos que busque la clave JWT en la raíz de la configuración (donde están las variables de entorno).
|
||||||
// Si no la encuentra, como respaldo, busca en la sección "Jwt" del appsettings.
|
// Si no la encuentra, como respaldo, busca en la sección "Jwt" del appsettings.
|
||||||
//var jwtKey = builder.Configuration["JWT_KEY"] ?? jwtSettings["Key"] ?? throw new ArgumentNullException("JWT_KEY or Jwt:Key not configured");
|
//var jwtKey = builder.Configuration["JWT_KEY"] ?? jwtSettings["Key"] ?? throw new ArgumentNullException("JWT_KEY or Jwt:Key not configured");
|
||||||
var jwtKey = jwtSettings["Key"] ?? throw new ArgumentNullException("Jwt:Key", "JWT Key not configured in appsettings.json");
|
//var jwtKey = jwtSettings["Key"] ?? throw new ArgumentNullException("Jwt:Key", "JWT Key not configured in appsettings.json");
|
||||||
|
|
||||||
var keyBytes = Encoding.ASCII.GetBytes(jwtKey);
|
//var keyBytes = Encoding.ASCII.GetBytes(jwtKey);
|
||||||
|
|
||||||
builder.Services.AddAuthentication(options =>
|
builder.Services.AddAuthentication(options =>
|
||||||
{
|
{
|
||||||
@@ -124,7 +171,7 @@ builder.Services.AddAuthentication(options =>
|
|||||||
ValidateLifetime = true,
|
ValidateLifetime = true,
|
||||||
ClockSkew = TimeSpan.Zero
|
ClockSkew = TimeSpan.Zero
|
||||||
};
|
};
|
||||||
});
|
});*/
|
||||||
|
|
||||||
// --- Configuración de Autorización ---
|
// --- Configuración de Autorización ---
|
||||||
builder.Services.AddAuthorization();
|
builder.Services.AddAuthorization();
|
||||||
@@ -221,7 +268,7 @@ if (app.Environment.IsDevelopment())
|
|||||||
|
|
||||||
app.UseCors(MyAllowSpecificOrigins);
|
app.UseCors(MyAllowSpecificOrigins);
|
||||||
|
|
||||||
app.UseAuthentication(); // Debe ir ANTES de UseAuthorization
|
app.UseAuthentication(); // SIEMPRE ANTES de UseAuthorization
|
||||||
app.UseAuthorization();
|
app.UseAuthorization();
|
||||||
|
|
||||||
app.MapControllers();
|
app.MapControllers();
|
||||||
|
|||||||
@@ -6,10 +6,10 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"Jwt": {
|
"Jwt": {
|
||||||
"Key": "badb1a38d221c9e23bcf70958840ca7f5a5dc54f2047dadf7ce45b578b5bc3e2",
|
"Key": "",
|
||||||
"Issuer": "GestionIntegralApi",
|
"Issuer": "",
|
||||||
"Audience": "GestionIntegralClient",
|
"Audience": "",
|
||||||
"DurationInHours": 8
|
"DurationInHours": 8
|
||||||
},
|
},
|
||||||
"AllowedHosts": "*"
|
"AllowedHosts": "*"
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user