using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; namespace MachineGuard; /// /// Metodi di estensione per la registrazione di MachineGuard nel container DI. /// public static class MachineGuardExtensions { /// /// Registra il servizio nel container DI. /// /// Se MachineGuard:Enabled è false in appsettings, viene registrato /// un guard no-op che approva sempre la verifica (utile per sviluppo/CI). /// Su piattaforme non-Windows, DPAPI non è disponibile e il guard viene disabilitato automaticamente. /// /// public static IServiceCollection AddMachineGuard( this IServiceCollection services, IConfiguration configuration) { services.Configure( configuration.GetSection(MachineGuardOptions.SectionName)); services.AddSingleton(sp => { var loggerFactory = sp.GetRequiredService(); var logger = loggerFactory.CreateLogger("MachineGuard.Startup"); #if DEBUG // In build Debug la protezione è sempre disabilitata — nessuna configurazione richiesta. logger.LogInformation( "MachineGuard: build DEBUG — protezione machine-binding disabilitata automaticamente."); return new NullMachineGuard(); #else // In build Release la protezione è sempre attiva. // Può essere disabilitata esplicitamente via MachineGuard:Enabled = false // (utile per ambienti Linux/Docker o casi eccezionali). var options = sp.GetRequiredService>(); if (!options.Value.Enabled) { logger.LogWarning( "MachineGuard: protezione machine-binding DISABILITATA via configurazione. " + "Impostare MachineGuard:Enabled = true in produzione."); return new NullMachineGuard(); } if (!OperatingSystem.IsWindows()) { logger.LogWarning( "MachineGuard: DPAPI non è disponibile su piattaforme non-Windows. " + "La protezione machine-binding è bypassata automaticamente."); return new NullMachineGuard(); } return CreateWindowsGuard(sp, options); #endif }); return services; } [System.Runtime.Versioning.SupportedOSPlatform("windows")] private static IMachineGuard CreateWindowsGuard( IServiceProvider sp, IOptions options) { var logger = sp.GetRequiredService>(); return new DpapiMachineGuard(options, logger); } }