Partager via


Nom d’utilisateur de sécurité des messages

Cet exemple montre comment implémenter une application qui utilise WS-Security avec l’authentification de nom d’utilisateur pour le client et nécessite l’authentification du serveur à l’aide du certificat X.509v3 du serveur. Tous les messages d’application entre le client et le serveur sont signés et chiffrés. Par défaut, le nom d’utilisateur et le mot de passe fournis par le client sont utilisés pour se connecter à un compte Windows valide. Cet exemple est basé sur WSHttpBinding. Cet exemple se compose d’un programme de console client (Client.exe) et d’une bibliothèque de services (Service.dll) hébergée par Internet Information Services (IIS). Le service implémente un contrat qui définit un modèle de communication de demande-réponse.

Remarque

La procédure d’installation et les instructions de génération de cet exemple se trouvent à la fin de cette rubrique.

Cet exemple illustre également les points suivants :

  • Le mappage par défaut aux comptes Windows pour permettre au processus d'autorisation supplémentaire de se dérouler.

  • Comment accéder aux informations d’identité de l’appelant à partir du code de service.

Le service expose un point de terminaison unique pour communiquer avec le service, qui est défini à l’aide du fichier de configuration Web.config. Le point de terminaison se compose d’une adresse, d’une liaison et d’un contrat. La liaison est configurée avec une <norme wsHttpBinding>, qui utilise par défaut la sécurité des messages. Cet exemple définit l’élément <wsHttpBinding> standard pour utiliser l’authentification du nom d’utilisateur du client. Le comportement spécifie que les informations d’identification de l’utilisateur doivent être utilisées pour l’authentification du service. Le certificat de serveur doit contenir la même valeur pour le nom de l’objet que l’attribut findValue dans serviceCredentials<>.

<system.serviceModel>
  <protocolMapping>
    <add scheme="http" binding="wsHttpBinding" />
  </protocolMapping>
  <bindings>
    <wsHttpBinding>
      <!--
      This configuration defines the security mode as Message and
      the clientCredentialType as Username.
      By default, Username authentication attempts to authenticate the provided
      username as a Windows computer or domain account.
      -->
      <binding>
        <security mode="Message">
          <message clientCredentialType="UserName"/>
        </security>
      </binding>
    </wsHttpBinding>
  </bindings>

  <!--For debugging purposes set the includeExceptionDetailInFaults attribute to true.-->
  <behaviors>
    <serviceBehaviors>
      <behavior>
        <!--
      The serviceCredentials behavior allows one to define a service certificate.
      A service certificate is used by the service to authenticate itself to the client and to provide message protection.
      This configuration references the "localhost" certificate installed during the setup instructions.
      -->
        <serviceCredentials>
          <serviceCertificate findValue="localhost" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName" />
        </serviceCredentials>
        <serviceMetadata httpGetEnabled="True"/>
        <serviceDebug includeExceptionDetailInFaults="False" />
      </behavior>
    </serviceBehaviors>
  </behaviors>
</system.serviceModel>

La configuration du point de terminaison client se compose d’une adresse absolue pour le point de terminaison de service, la liaison et le contrat. La liaison cliente est configurée avec les paramètres appropriés securityMode et authenticationMode. Lors de l’exécution dans un scénario inter-ordinateur, l’adresse du point de terminaison de service doit être modifiée en conséquence.

<system.serviceModel>
  <client>
    <endpoint address="http://localhost/servicemodelsamples/service.svc"
              binding="wsHttpBinding"
              bindingConfiguration="Binding1"
              behaviorConfiguration="ClientCredentialsBehavior"
              contract="Microsoft.ServiceModel.Samples.ICalculator" />
  </client>

  <bindings>
    <wsHttpBinding>
      <!--
      This configuration defines the security mode as Message and
      the clientCredentialType as Username.
      -->
      <binding name="Binding1">
        <security mode="Message">
          <message clientCredentialType="UserName"/>
        </security>
      </binding>
    </wsHttpBinding>
  </bindings>

  <!--For debugging purposes set the includeExceptionDetailInFaults attribute to true.-->
  <behaviors>
    <endpointBehaviors>
      <behavior name="ClientCredentialsBehavior">
        <!--
      Setting the certificateValidationMode to PeerOrChainTrust means that if the certificate
      is in the user's Trusted People store, then it is trusted without performing a
      validation of the certificate's issuer chain. This setting is used here for convenience so that the
      sample can be run without having to have certificates issued by a certification authority (CA).
      This setting is less secure than the default, ChainTrust. The security implications of this
      setting should be carefully considered before using PeerOrChainTrust in production code.
      -->
        <clientCredentials>
          <serviceCertificate>
            <authentication certificateValidationMode="PeerOrChainTrust" />
          </serviceCertificate>
        </clientCredentials>
      </behavior>
    </endpointBehaviors>
  </behaviors>
</system.serviceModel>

L’implémentation du client définit le nom d’utilisateur et le mot de passe à utiliser.

// Create a client.
CalculatorClient client = new CalculatorClient();

// Configure client with valid computer or domain account (username,password).
client.ClientCredentials.UserName.UserName = username;
client.ClientCredentials.UserName.Password = password.ToString();

// Call GetCallerIdentity service operation.
Console.WriteLine(client.GetCallerIdentity());
...
//Closing the client gracefully closes the connection and cleans up resources.
client.Close();

Lorsque vous exécutez l’exemple, les demandes et réponses de l’opération s’affichent dans la fenêtre de la console cliente. Appuyez sur Entrée dans la fenêtre du client pour arrêter le client.

MyMachine\TestAccount
Add(100,15.99) = 115.99
Subtract(145,76.54) = 68.46
Multiply(9,81.25) = 731.25
Divide(22,7) = 3.14285714285714
Press <ENTER> to terminate client.

Le fichier batch Setup.bat inclus dans les exemples MessageSecurity vous permet de configurer le serveur avec un certificat approprié pour exécuter une application hébergée nécessitant une sécurité basée sur des certificats. Le fichier batch peut être exécuté en deux modes. Pour exécuter le fichier de commandes en mode ordinateur unique, tapez setup.bat dans la ligne de commande. Pour l’exécuter en mode service, tapez setup.bat service. Vous utilisez ce mode lors de l’exécution de l’exemple sur plusieurs ordinateurs. Pour plus d’informations, consultez la procédure de configuration à la fin de cette rubrique.

Voici une brève vue d’ensemble des différentes sections des fichiers batch.

  • Création du certificat de serveur

    Les lignes suivantes du fichier batch Setup.bat créent le certificat de serveur à utiliser.

    echo ************
    echo Server cert setup starting
    echo %SERVER_NAME%
    echo ************
    echo making server cert
    echo ************
    makecert.exe -sr LocalMachine -ss MY -a sha1 -n CN=%SERVER_NAME% -sky exchange -pe
    

    La variable %SERVER_NAME% spécifie le nom du serveur. Le certificat est stocké dans le magasin LocalMachine. Si le fichier batch Setup.bat est exécuté avec un argument de service (par exemple setup.bat service) le %SERVER_NAME% contient le nom de domaine complet de l’ordinateur. Sinon, il est défini par défaut sur localhost.

  • Installation du certificat de serveur dans le magasin de certificats approuvé du client

    La ligne suivante copie le certificat de serveur dans le magasin de personnes de confiance du client. Cette étape est requise, car les certificats générés par Makecert.exe ne sont pas implicitement approuvés par le système client. Si vous disposez déjà d’un certificat rooté dans un certificat racine approuvé par le client( par exemple, un certificat émis par Microsoft), cette étape de remplissage du magasin de certificats client avec le certificat de serveur n’est pas nécessaire.

    certmgr.exe -add -r LocalMachine -s My -c -n %SERVER_NAME% -r CurrentUser -s TrustedPeople
    
  • Octroi d’autorisations sur la clé privée du certificat

    Les lignes suivantes du fichier batch Setup.bat rendent le certificat de serveur stocké dans le magasin LocalMachine accessible au compte de processus worker ASP.NET.

    echo ************
    echo setting privileges on server certificates
    echo ************
    for /F "delims=" %%i in ('"%ProgramFiles%\ServiceModelSampleTools\FindPrivateKey.exe" My LocalMachine -n CN^=%SERVER_NAME% -a') do set PRIVATE_KEY_FILE=%%i
    set WP_ACCOUNT=NT AUTHORITY\NETWORK SERVICE
    (ver | findstr /C:"5.1") && set WP_ACCOUNT=%COMPUTERNAME%\ASPNET
    echo Y|cacls.exe "%PRIVATE_KEY_FILE%" /E /G "%WP_ACCOUNT%":R
    iisreset
    

    Remarque

    Si vous utilisez une édition anglaise de Windows non américaine, vous devez modifier le fichier Setup.bat et remplacer le nom de compte NT AUTHORITY\NETWORK SERVICE par votre équivalent régional.

Pour configurer, générer et exécuter l’exemple

  1. Assurez-vous d’avoir effectué la Procédure d’installation unique pour les exemples Windows Communication Foundation.

  2. Pour générer l’édition C# ou Visual Basic .NET de la solution, conformez-vous aux instructions figurant dans Building the Windows Communication Foundation Samples.

Pour exécuter l’exemple sur le même ordinateur

  1. Vérifiez que le chemin inclut le dossier où se trouvent Makecert.exe et FindPrivateKey.exe.

  2. Exécutez Setup.bat à partir de l’exemple de dossier d’installation à une Invite de commandes développeur pour Visual Studio ouverte avec des privilèges d’administrateur. Cela installe tous les certificats requis pour l’exécution de l’exemple.

    Remarque

    Le fichier de commandes Setup.bat est conçu pour être exécuté à partir d’une Invite de commandes développeur pour Visual Studio. La variable d’environnement de chemin d’accès doit pointer vers le répertoire où le Kit de développement logiciel (SDK) est installé. Cette variable d’environnement est définie automatiquement dans une Invite de commandes développeur pour Visual Studio.

  3. Vérifiez l’accès au service à l’aide d’un navigateur en entrant l’adresse http://localhost/servicemodelsamples/service.svc.

  4. Lancez Client.exe à partir de \client\bin. L’activité du client s’affiche sur l’application console cliente.

  5. Si le client et le service ne sont pas en mesure de communiquer, consultez Conseils de résolution des problèmes pour les exemples WCF.

Pour exécuter l’exemple sur différents ordinateurs

  1. Créez un répertoire sur l’ordinateur de service. Créez une application virtuelle nommée servicemodelsamples pour ce répertoire à l’aide de l’outil de gestion Internet Information Services.

  2. Copiez les fichiers de programme de service de \inetpub\wwwroot\servicemodelsamples dans le répertoire virtuel sur l’ordinateur de service. Vérifiez que vous copiez les fichiers dans le sous-répertoire \bin. Copiez également les fichiers Setup.bat et Cleanup.bat sur l’ordinateur de service.

  3. Créez un répertoire sur l’ordinateur client pour les fichiers binaires clients.

  4. Copiez les fichiers de programme client dans le répertoire client sur l’ordinateur client. Copiez également les fichiers Setup.bat, Cleanup.batet ImportServiceCert.bat sur le client.

  5. Sur le serveur, exécutez setup.bat service dans une Invite de commandes développeur pour Visual Studio ouverte avec des privilèges d’administrateur. L’exécution de setup.bat avec l’argument service crée un certificat de service avec le nom de domaine complet de l’ordinateur et exporte le certificat de service vers un fichier nommé Service.cer.

  6. Modifiez Web.config pour refléter le nouveau nom de certificat (dans l’attribut findValue dans l’élément serviceCertificate) qui est le même que le nom de domaine complet de l’ordinateur.

  7. Copiez le fichier Service.cer du répertoire de service vers le répertoire client sur l’ordinateur client.

  8. Dans le fichier Client.exe.config sur l’ordinateur client, modifiez la valeur d’adresse du point de terminaison pour qu’il corresponde à la nouvelle adresse de votre service.

  9. Sur le client, exécutez ImportServiceCert.bat dans une Invite de commandes développeur pour Visual Studio ouverte avec des privilèges d’administrateur. Cela importe le certificat de service à partir du fichier Service.cer dans le magasin CurrentUser - TrustedPeople.

  10. Sur l’ordinateur client, lancez Client.exe à partir d’une invite de commande. Si le client et le service ne sont pas en mesure de communiquer, consultez Conseils de résolution des problèmes pour les exemples WCF.

Pour nettoyer après le test

  • Exécutez Cleanup.bat dans le dossier d’exemples une fois que vous avez terminé d’exécuter l’exemple.

    Remarque

    Ce script ne supprime pas les certificats de service sur un client lors de l’exécution de cet exemple sur les ordinateurs. Si vous avez exécuté des exemples Windows Communication Foundation (WCF) qui utilisent des certificats sur des ordinateurs, veillez à effacer les certificats de service installés dans le magasin CurrentUser - TrustedPeople. Pour ce faire, utilisez la commande suivante : certmgr -del -r CurrentUser -s TrustedPeople -c -n <Fully Qualified Server Machine Name> Par exemple : certmgr -del -r CurrentUser -s TrustedPeople -c -n server1.contoso.com.