Condividi tramite


Procedura: autenticare con un nome utente e una password

In questo argomento viene illustrato come abilitare l'autenticazione di un client con un nome utente e una password di dominio Windows in un servizio WCF (Windows Communication Foundation). Si presuppone che l'utente disponga di un servizio WCF self-hosted funzionante. Per un esempio di creazione di un servizio WCF self-hosted di base, vedere Esercitazione introduttiva. In questo argomento si presuppone che il servizio sia configurato tramite codice. Per un esempio di configurazione di un servizio simile tramite un file di configurazione, vedere Sicurezza dei messaggi tramite nome utente.

Per configurare un servizio in modo che effettui l'autenticazione dei client mediante il nome utente e la password di dominio Windows, utilizzare l'oggetto WSHttpBinding e impostare la relativa proprietà Security.Mode su Message. Inoltre, è necessario specificare un certificato X509 che verrà utilizzato per crittografare il nome utente e la password quando vengono inviati dal client al servizio.

Nel client è necessario richiedere all'utente il nome utente e la password e specificare le credenziali dell'utente nel proxy client WCF.

Per configurare un servizio WCF per l'autenticazione tramite nome utente e password di dominio Windows

  1. Creare un'istanza dell'oggetto WSHttpBinding, impostare la modalità di sicurezza dell'associazione su WSHttpSecurity.Message, impostare l'oggetto ClientCredentialType dell'associazione su MessageCredentialType.UserName e aggiungere un endpoint del servizio utilizzando l'associazione configurata all'host del servizio come illustrato nel codice seguente:

    // ...
    var userNameBinding = new WSHttpBinding();
    userNameBinding.Security.Mode = SecurityMode.Message;
    userNameBinding.Security.Message.ClientCredentialType = MessageCredentialType.UserName;
    svcHost.AddServiceEndpoint(typeof(IService1), userNameBinding, "");
    // ...
    
  2. Specificare il certificato del server utilizzato per crittografare le informazioni relative al nome utente e alla password inviate tramite la rete. Questo codice deve seguire immediatamente il codice illustrato sopra. Nell'esempio seguente viene usato il certificato creato dal file setup.bat dell'esempio Sicurezza dei messaggi tramite nome utente:

    // ...
    svcHost.Credentials.ServiceCertificate.SetCertificate(StoreLocation.LocalMachine, StoreName.My, X509FindType.FindBySubjectName, "localhost");
    // ...
    

    È possibile utilizzare il proprio certificato; è sufficiente modificare il codice in modo che faccia riferimento a tale certificato. Per altre informazioni su creazione e uso di certificati, vedere Uso dei certificati. Assicurarsi che il certificato si trovi nell'archivio certificati Persone attendibili del computer locale. Questa operazione può essere effettuata eseguendo mmc.exe e scegliendo File, quindi Aggiungi/Rimuovi snap-in.... Nella finestra di dialogo Aggiungi o rimuovi snap-in selezionare Snap-in certificati e fare clic su Aggiungi. Nella finestra di dialogo Snap-in certificati selezionare Account del computer. Per impostazione predefinita, il certificato generato nell'esempio di sicurezza dei messaggi tramite nome utente sarà posizionato nella cartella Personale/Certificati, Elencato come "localhost" nella colonna Rilasciato a della finestra MMC. Trascinare e rilasciare il certificato nella cartella Persone attendibili. In questo modo il certificato verrà considerato come attendibile da WCF quando viene effettuata l'autenticazione.

Per chiamare il servizio passando nome utente e password

  1. L'applicazione client deve richiedere all'utente il nome utente e la password. Il codice seguente richiede all'utente il nome utente e la password:

    Avviso

    Questo codice non deve essere utilizzato in produzione poiché la password viene visualizzata durante l'immissione.

    public static void GetPassword(out string username, out string password)
    {
        Console.WriteLine("Provide a valid machine or domain account. [domain\\user]");
        Console.WriteLine("   Enter username:");
        username = Console.ReadLine();
        Console.WriteLine("   Enter password:");
        password = Console.ReadLine();
    }
    
  2. Creare un'istanza del proxy client specificando le credenziali del client, come illustrato nel codice seguente:

    string username;
    string password;
    
    // Instantiate the proxy.
    var proxy = new Service1Client();
    
    // Prompt the user for username & password.
    GetPassword(out username, out password);
    
    // Set the user's credentials on the proxy.
    proxy.ClientCredentials.UserName.UserName = username;
    proxy.ClientCredentials.UserName.Password = password;
    
    // Treat the test certificate as trusted.
    proxy.ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode = System.ServiceModel.Security.X509CertificateValidationMode.PeerOrChainTrust;
    // Call the service operation using the proxy
    

Vedi anche