Procedura: controllare gli eventi di sicurezza di Windows Communication Foundation

Windows Communication Foundation (WCF) consente di registrare gli eventi di sicurezza nel registro eventi di Windows, che può essere visualizzato tramite il Visualizzatore eventi di Windows. In questo argomento viene illustrato come configurare un'applicazione in modo che registri eventi di sicurezza. Per altre informazioni sul controllo WCF, vedere Controllo.

Per controllare gli eventi di sicurezza nel codice

  1. Specificare il percorso del registro di controllo. A questo scopo, impostare la proprietà AuditLogLocation della classe ServiceSecurityAuditBehavior su uno dei valori dell'enumerazione AuditLogLocation, come illustrato nel codice seguente.

    // Create a new auditing behavior and set the log location.
    ServiceSecurityAuditBehavior newAudit =
        new ServiceSecurityAuditBehavior();
    newAudit.AuditLogLocation =
        AuditLogLocation.Application;
    
    ' Create a new auditing behavior and set the log location.
    Dim newAudit As New ServiceSecurityAuditBehavior()
    newAudit.AuditLogLocation = AuditLogLocation.Application
    

    L'enumerazione AuditLogLocation ha tre valori: Application, Security o Default. Il valore specifica uno dei log visibili nel Visualizzatore eventi, il registro protezione o il registro applicazioni. Se si usa il valore Default, il log effettivo dipenderà dal sistema operativo su cui è in esecuzione l'applicazione. Se il controllo è attivato e il percorso del log non viene specificato, verrà usato, per impostazione predefinita, il registro Security, per le piattaforme che supportano la scrittura nel registro protezione, altrimenti verrà usato il registro Application. Solo Windows Server 2003 e Windows Vista supportano la scrittura nel log di sicurezza per impostazione predefinita.

  2. Impostare i tipi di eventi da controllare. È possibile controllare simultaneamente eventi a livello di servizio o eventi di autorizzazione a livello di messaggio. A questo scopo, impostare la proprietà ServiceAuthorizationAuditLevel o MessageAuthenticationAuditLevel su uno dei valori dell'enumerazione AuditLevel, come illustrato nel codice seguente.

    // Create a new auditing behavior and set the log location.
    ServiceSecurityAuditBehavior newAudit =
        new ServiceSecurityAuditBehavior();
    newAudit.AuditLogLocation =
        AuditLogLocation.Application;
    newAudit.MessageAuthenticationAuditLevel =
        AuditLevel.SuccessOrFailure;
    newAudit.ServiceAuthorizationAuditLevel =
        AuditLevel.SuccessOrFailure;
    
    newAudit.MessageAuthenticationAuditLevel = _
        AuditLevel.SuccessOrFailure
    newAudit.ServiceAuthorizationAuditLevel = _
        AuditLevel.SuccessOrFailure
    
  3. Specificare se esporre o meno gli errori all'applicazione relativamente agli eventi di controllo del log. Impostare la proprietà SuppressAuditFailure su true o false, come illustrato nel codice seguente.

    // Create a new auditing behavior and set the log location.
    ServiceSecurityAuditBehavior newAudit =
        new ServiceSecurityAuditBehavior();
    newAudit.AuditLogLocation =
        AuditLogLocation.Application;
    newAudit.MessageAuthenticationAuditLevel =
        AuditLevel.SuccessOrFailure;
    newAudit.ServiceAuthorizationAuditLevel =
        AuditLevel.SuccessOrFailure;
    newAudit.SuppressAuditFailure = false;
    
    newAudit.SuppressAuditFailure = False
    

    La proprietà SuppressAuditFailure predefinita è true, in modo che l'errore da controllare non influenzi l'applicazione. In caso contrario, viene generata un'eccezione. Per ogni controllo riuscito viene scritta una traccia dettagliata. Per ogni errore da controllare, la traccia viene scritta a livello errore.

  4. Eliminare la classe ServiceSecurityAuditBehavior esistente dalla raccolta dei comportamenti trovati nella descrizione di una classe ServiceHost. La raccolta dei comportamenti è accessibile tramite la proprietà Behaviors, che a sua volta è accessibile dalla proprietà Description. Aggiungere quindi la nuova classe ServiceSecurityAuditBehavior alla stessa raccolta, come illustrato nel codice seguente.

    // Remove the old behavior and add the new.
    serviceHost.Description.
        Behaviors.Remove<ServiceSecurityAuditBehavior>();
    serviceHost.Description.Behaviors.Add(newAudit);
    
    ' Remove the old behavior and add the new.
    serviceHost.Description.Behaviors.Remove(Of ServiceSecurityAuditBehavior)
    serviceHost.Description.Behaviors.Add(newAudit)
    

Per impostare il controllo nella configurazione

  1. Per configurare il controllo nella configurazione, aggiungere un elemento <behavior> alla sezione <behaviors> del file web.config. Aggiungere quindi un elemento <serviceSecurityAudit> e impostare i vari attributi, come illustrato nell'esempio seguente.

    <behaviors>  
       <behavior name="myAuditBehavior">  
          <serviceSecurityAudit auditLogLocation="Application"  
                suppressAuditFailure="false"
                serviceAuthorizationAuditLevel="None"
                messageAuthenticationAuditLevel="SuccessOrFailure" />  
          </behavior>  
    </behaviors>  
    
  2. È necessario specificare il comportamento del servizio, come illustrato nell'esempio seguente.

    <services>  
        <service type="WCS.Samples.Service.Echo"
        behaviorConfiguration=" myAuditBehavior">  
           <endpoint address=""  
                    binding="wsHttpBinding"  
                    bindingConfiguration="CertificateDefault"
                    contract="WCS.Samples.Service.IEcho" />  
        </service>  
    </services>  
    

Esempio

Nel codice seguente viene creata un'istanza della classe ServiceHost e viene aggiunta una nuova classe ServiceSecurityAuditBehavior alla raccolta dei comportamenti.

public static void Main()
{
    // Get base address from appsettings in configuration.
    Uri baseAddress = new Uri(ConfigurationManager.
        AppSettings["baseAddress"]);

    // Create a ServiceHost for the CalculatorService type
    // and provide the base address.
    using (ServiceHost serviceHost = new
        ServiceHost(typeof(CalculatorService), baseAddress))
    {
        // Create a new auditing behavior and set the log location.
        ServiceSecurityAuditBehavior newAudit =
            new ServiceSecurityAuditBehavior();
        newAudit.AuditLogLocation =
            AuditLogLocation.Application;
        newAudit.MessageAuthenticationAuditLevel =
            AuditLevel.SuccessOrFailure;
        newAudit.ServiceAuthorizationAuditLevel =
            AuditLevel.SuccessOrFailure;
        newAudit.SuppressAuditFailure = false;
        // Remove the old behavior and add the new.
        serviceHost.Description.
            Behaviors.Remove<ServiceSecurityAuditBehavior>();
        serviceHost.Description.Behaviors.Add(newAudit);
        // Open the ServiceHostBase to create listeners
        // and start listening for messages.
        serviceHost.Open();

        // The service can now be accessed.
        Console.WriteLine("The service is ready.");
        Console.WriteLine("Press <ENTER> to terminate service.");
        Console.WriteLine();
        Console.ReadLine();

        // Close the ServiceHostBase to shutdown the service.
        serviceHost.Close();
    }
}
Public Shared Sub Main()
    ' Get base address from appsettings in configuration.
    Dim baseAddress As New Uri(ConfigurationManager.AppSettings("baseAddress"))

    ' Create a ServiceHost for the CalculatorService type 
    ' and provide the base address.
    Dim serviceHost As New ServiceHost(GetType(CalculatorService), baseAddress)
    Try
        ' Create a new auditing behavior and set the log location.
        Dim newAudit As New ServiceSecurityAuditBehavior()
        newAudit.AuditLogLocation = AuditLogLocation.Application
        newAudit.MessageAuthenticationAuditLevel = _
            AuditLevel.SuccessOrFailure
        newAudit.ServiceAuthorizationAuditLevel = _
            AuditLevel.SuccessOrFailure
        newAudit.SuppressAuditFailure = False
        ' Remove the old behavior and add the new.
        serviceHost.Description.Behaviors.Remove(Of ServiceSecurityAuditBehavior)
        serviceHost.Description.Behaviors.Add(newAudit)
        ' Open the ServiceHostBase to create listeners 
        ' and start listening for messages.
        serviceHost.Open()

        ' The service can now be accessed.
        Console.WriteLine("The service is ready.")
        Console.WriteLine("Press <ENTER> to terminate service.")
        Console.WriteLine()
        Console.ReadLine()

        ' Close the ServiceHostBase to shutdown the service.
        serviceHost.Close()
    Finally
    End Try

End Sub

Sicurezza di .NET Framework

Se si imposta la proprietà SuppressAuditFailure su true, viene evitata la visualizzazione di qualsiasi errore per generare controlli di sicurezza (se la proprietà viene impostata su false, viene generata un'eccezione). Tuttavia, se si abilita la proprietà Impostazioni di sicurezza locali di Windows seguente, un errore per generare eventi di controllo causerà l'arresto immediato di Windows:

Controllo: arresto del sistema immediato se non è possibile registrare i controlli di sicurezza

Per impostare la proprietà, aprire la finestra di dialogo Impostazioni protezione locale. In Impostazioni di sicurezza fare clic su Criteri locali. Quindi fare clic su Opzioni di sicurezza.

Se la proprietà AuditLogLocation è impostata su Security e se nei Criteri di sicurezza locali non è stata impostata l'opzione Controlla accesso agli oggetti, gli eventi di controllo non vengono scritti nel registro protezione. Si noti che non viene restituito alcun errore, ma non vengono scritte voci di controllo nel registro protezione.

Vedi anche