d042863a56
- Aggiunto supporto schedulazione con intervalli flessibili (secondi/minuti/ore/giorni/settimane/mesi) - Esteso modello ProfileSchedule con campi IntervalValue e IntervalUnit - Ottimizzato ScheduledJobService per controlli ogni 30s con esecuzione parallela - Implementata interfaccia UI completa con anteprima real-time in italiano - Aggiunta migrazione database AddIntervalSchedulingFields - Implementati metodi calcolo NextExecutionTime per intervalli - Aggiunta gestione tracking anti-duplicati e cleanup automatico - Creata documentazione completa (6 file, 2500+ righe) Modifiche tecniche: - ProfileSchedule.cs: Nuovi campi e metodi CalculateNextInterval/GetScheduleDescription - ScheduledJobService.cs: Ridotto check interval a 30s, aggiunto parallel processing - ProfileScheduleService.cs: Supporto calcolo intervalli in UpdateNextExecutionTimeAsync - Scheduling.razor: Aggiunta sezione UI per configurazione intervalli - Scheduling.razor.cs: Implementato GetIntervalPreview() e gestione stato campi
347 lines
14 KiB
Plaintext
347 lines
14 KiB
Plaintext
@inject ILogger<SecurityTab> Logger
|
|
|
|
<div class="settings-section">
|
|
<h4>
|
|
<i class="fas fa-shield-alt text-primary me-2"></i>
|
|
Sicurezza e Privacy
|
|
</h4>
|
|
<p class="text-muted">
|
|
Configurazioni per la sicurezza dei dati e la gestione delle credenziali.
|
|
</p>
|
|
|
|
<div class="row">
|
|
<div class="col-md-6">
|
|
<div class="card">
|
|
<div class="card-header">
|
|
<h5 class="card-title mb-0">
|
|
<i class="fas fa-lock text-danger me-2"></i>
|
|
Crittografia
|
|
</h5>
|
|
</div>
|
|
<div class="card-body">
|
|
<p class="card-text">Gestione della crittografia delle credenziali.</p>
|
|
|
|
<div class="alert alert-info">
|
|
<i class="fas fa-info-circle me-2"></i>
|
|
<strong>Data Protection API Attiva</strong><br>
|
|
Le credenziali sono crittografate utilizzando la Data Protection API di .NET.
|
|
</div>
|
|
|
|
<div class="mb-3">
|
|
<div class="d-flex justify-content-between align-items-center">
|
|
<span>Stato Crittografia:</span>
|
|
<span class="badge bg-success">
|
|
<i class="fas fa-check-circle me-1"></i>
|
|
Attiva
|
|
</span>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="mb-3">
|
|
<div class="d-flex justify-content-between align-items-center">
|
|
<span>Algoritmo:</span>
|
|
<span class="badge bg-info">AES-256</span>
|
|
</div>
|
|
</div>
|
|
|
|
<button class="btn btn-outline-warning btn-sm" @onclick="RegenerateKeys" disabled="@isRegeneratingKeys">
|
|
@if (isRegeneratingKeys)
|
|
{
|
|
<div class="spinner-border spinner-border-sm me-2" role="status"></div>
|
|
}
|
|
else
|
|
{
|
|
<i class="fas fa-key me-1"></i>
|
|
}
|
|
Rigenera Chiavi
|
|
</button>
|
|
<div class="form-text">
|
|
<i class="fas fa-exclamation-triangle text-warning me-1"></i>
|
|
Attenzione: La rigenerazione delle chiavi renderà inaccessibili le credenziali esistenti
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="col-md-6">
|
|
<div class="card">
|
|
<div class="card-header">
|
|
<h5 class="card-title mb-0">
|
|
<i class="fas fa-user-shield text-success me-2"></i>
|
|
Audit e Logging
|
|
</h5>
|
|
</div>
|
|
<div class="card-body">
|
|
<p class="card-text">Configurazione del logging di sicurezza.</p>
|
|
|
|
<div class="form-check mb-3">
|
|
<input class="form-check-input" type="checkbox" @bind="securitySettings.LogCredentialAccess" id="logCredentialAccess">
|
|
<label class="form-check-label" for="logCredentialAccess">
|
|
Log accesso alle credenziali
|
|
</label>
|
|
</div>
|
|
|
|
<div class="form-check mb-3">
|
|
<input class="form-check-input" type="checkbox" @bind="securitySettings.LogDataTransfers" id="logDataTransfers">
|
|
<label class="form-check-label" for="logDataTransfers">
|
|
Log trasferimenti dati
|
|
</label>
|
|
</div>
|
|
|
|
<div class="form-check mb-3">
|
|
<input class="form-check-input" type="checkbox" @bind="securitySettings.LogFailedOperations" id="logFailedOperations">
|
|
<label class="form-check-label" for="logFailedOperations">
|
|
Log operazioni fallite
|
|
</label>
|
|
</div>
|
|
|
|
<div class="mb-3">
|
|
<label for="logRetentionDays" class="form-label">Giorni di ritenzione log:</label>
|
|
<input type="number" class="form-control" id="logRetentionDays" @bind="securitySettings.LogRetentionDays"
|
|
min="1" max="365" step="1">
|
|
</div>
|
|
|
|
<button class="btn btn-primary btn-sm" @onclick="SaveSecuritySettings">
|
|
<i class="fas fa-save me-1"></i>
|
|
Salva Impostazioni
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="row mt-4">
|
|
<div class="col-md-6">
|
|
<div class="card">
|
|
<div class="card-header">
|
|
<h5 class="card-title mb-0">
|
|
<i class="fas fa-network-wired text-primary me-2"></i>
|
|
Connessioni Sicure
|
|
</h5>
|
|
</div>
|
|
<div class="card-body">
|
|
<p class="card-text">Impostazioni per le connessioni di rete.</p>
|
|
|
|
<div class="form-check mb-3">
|
|
<input class="form-check-input" type="checkbox" @bind="securitySettings.EnforceHttps" id="enforceHttps">
|
|
<label class="form-check-label" for="enforceHttps">
|
|
Forza HTTPS per API REST
|
|
</label>
|
|
</div>
|
|
|
|
<div class="form-check mb-3">
|
|
<input class="form-check-input" type="checkbox" @bind="securitySettings.ValidateSslCertificates" id="validateSsl">
|
|
<label class="form-check-label" for="validateSsl">
|
|
Valida certificati SSL/TLS
|
|
</label>
|
|
</div>
|
|
|
|
<div class="mb-3">
|
|
<label for="connectionTimeout" class="form-label">Timeout connessioni (secondi):</label>
|
|
<input type="number" class="form-control" id="connectionTimeout" @bind="securitySettings.ConnectionTimeoutSeconds"
|
|
min="5" max="300" step="5">
|
|
</div>
|
|
|
|
<div class="alert alert-warning">
|
|
<i class="fas fa-exclamation-triangle me-2"></i>
|
|
<strong>Nota:</strong> Disabilitare la validazione SSL solo in ambienti di sviluppo sicuri.
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="col-md-6">
|
|
<div class="card">
|
|
<div class="card-header">
|
|
<h5 class="card-title mb-0">
|
|
<i class="fas fa-database text-warning me-2"></i>
|
|
Backup Sicurezza
|
|
</h5>
|
|
</div>
|
|
<div class="card-body">
|
|
<p class="card-text">Configurazione dei backup di sicurezza.</p>
|
|
|
|
<div class="form-check mb-3">
|
|
<input class="form-check-input" type="checkbox" @bind="securitySettings.AutoBackupEnabled" id="autoBackup">
|
|
<label class="form-check-label" for="autoBackup">
|
|
Backup automatico giornaliero
|
|
</label>
|
|
</div>
|
|
|
|
<div class="form-check mb-3">
|
|
<input class="form-check-input" type="checkbox" @bind="securitySettings.EncryptBackups" id="encryptBackups">
|
|
<label class="form-check-label" for="encryptBackups">
|
|
Cripta file di backup
|
|
</label>
|
|
</div>
|
|
|
|
<div class="mb-3">
|
|
<label for="backupRetentionDays" class="form-label">Giorni di ritenzione backup:</label>
|
|
<input type="number" class="form-control" id="backupRetentionDays" @bind="securitySettings.BackupRetentionDays"
|
|
min="1" max="365" step="1">
|
|
</div>
|
|
|
|
@if (securitySettings.AutoBackupEnabled)
|
|
{
|
|
<div class="alert alert-info">
|
|
<i class="fas fa-clock me-2"></i>
|
|
Prossimo backup automatico: <strong>Domani alle 02:00</strong>
|
|
</div>
|
|
}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="row mt-4">
|
|
<div class="col-12">
|
|
<div class="card">
|
|
<div class="card-header">
|
|
<h5 class="card-title mb-0">
|
|
<i class="fas fa-exclamation-triangle text-danger me-2"></i>
|
|
Azioni Critiche
|
|
</h5>
|
|
</div>
|
|
<div class="card-body">
|
|
<div class="row">
|
|
<div class="col-md-6">
|
|
<h6>Pulizia Cache Credenziali</h6>
|
|
<p class="text-muted">Pulisce la cache delle credenziali in memoria.</p>
|
|
<button class="btn btn-outline-warning" @onclick="ClearCredentialCache">
|
|
<i class="fas fa-broom me-1"></i>
|
|
Pulisci Cache
|
|
</button>
|
|
</div>
|
|
<div class="col-md-6">
|
|
<h6>Reset Configurazione Sicurezza</h6>
|
|
<p class="text-muted">Ripristina le impostazioni di sicurezza ai valori predefiniti.</p>
|
|
<button class="btn btn-outline-danger" @onclick="ResetSecuritySettings">
|
|
<i class="fas fa-undo me-1"></i>
|
|
Reset Impostazioni
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
@code {
|
|
[Parameter] public EventCallback<(string message, string type)> OnShowToast { get; set; }
|
|
|
|
private bool isRegeneratingKeys = false;
|
|
private SecuritySettings securitySettings = new()
|
|
{
|
|
LogCredentialAccess = true,
|
|
LogDataTransfers = true,
|
|
LogFailedOperations = true,
|
|
LogRetentionDays = 30,
|
|
EnforceHttps = true,
|
|
ValidateSslCertificates = true,
|
|
ConnectionTimeoutSeconds = 30,
|
|
AutoBackupEnabled = false,
|
|
EncryptBackups = true,
|
|
BackupRetentionDays = 30
|
|
};
|
|
|
|
private async Task SaveSecuritySettings()
|
|
{
|
|
try
|
|
{
|
|
// Implementazione semplificata - in produzione salvare nel database o file di configurazione
|
|
await Task.Delay(500);
|
|
|
|
await OnShowToast.InvokeAsync(("Impostazioni di sicurezza salvate", "success"));
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Logger.LogError(ex, "Errore salvataggio impostazioni sicurezza");
|
|
await OnShowToast.InvokeAsync(("Errore salvataggio impostazioni", "error"));
|
|
}
|
|
}
|
|
|
|
private async Task RegenerateKeys()
|
|
{
|
|
try
|
|
{
|
|
isRegeneratingKeys = true;
|
|
StateHasChanged();
|
|
|
|
// Simula rigenerazione chiavi
|
|
await Task.Delay(2000);
|
|
|
|
await OnShowToast.InvokeAsync(("Chiavi di crittografia rigenerate", "success"));
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Logger.LogError(ex, "Errore rigenerazione chiavi");
|
|
await OnShowToast.InvokeAsync(("Errore rigenerazione chiavi", "error"));
|
|
}
|
|
finally
|
|
{
|
|
isRegeneratingKeys = false;
|
|
StateHasChanged();
|
|
}
|
|
}
|
|
|
|
private async Task ClearCredentialCache()
|
|
{
|
|
try
|
|
{
|
|
// Implementazione semplificata
|
|
await Task.Delay(500);
|
|
|
|
await OnShowToast.InvokeAsync(("Cache credenziali pulita", "success"));
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Logger.LogError(ex, "Errore pulizia cache");
|
|
await OnShowToast.InvokeAsync(("Errore pulizia cache", "error"));
|
|
}
|
|
}
|
|
|
|
private async Task ResetSecuritySettings()
|
|
{
|
|
try
|
|
{
|
|
securitySettings = new SecuritySettings
|
|
{
|
|
LogCredentialAccess = true,
|
|
LogDataTransfers = true,
|
|
LogFailedOperations = true,
|
|
LogRetentionDays = 30,
|
|
EnforceHttps = true,
|
|
ValidateSslCertificates = true,
|
|
ConnectionTimeoutSeconds = 30,
|
|
AutoBackupEnabled = false,
|
|
EncryptBackups = true,
|
|
BackupRetentionDays = 30
|
|
};
|
|
|
|
await Task.Delay(300);
|
|
await OnShowToast.InvokeAsync(("Impostazioni di sicurezza ripristinate", "info"));
|
|
StateHasChanged();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Logger.LogError(ex, "Errore reset impostazioni");
|
|
await OnShowToast.InvokeAsync(("Errore reset impostazioni", "error"));
|
|
}
|
|
}
|
|
|
|
private class SecuritySettings
|
|
{
|
|
public bool LogCredentialAccess { get; set; }
|
|
public bool LogDataTransfers { get; set; }
|
|
public bool LogFailedOperations { get; set; }
|
|
public int LogRetentionDays { get; set; }
|
|
public bool EnforceHttps { get; set; }
|
|
public bool ValidateSslCertificates { get; set; }
|
|
public int ConnectionTimeoutSeconds { get; set; }
|
|
public bool AutoBackupEnabled { get; set; }
|
|
public bool EncryptBackups { get; set; }
|
|
public int BackupRetentionDays { get; set; }
|
|
}
|
|
}
|