Partager via


Exemple d’identité de service

Cet exemple d’identité de service montre comment définir l’identité d’un service. Au moment du design, un client peut récupérer l’identité à l’aide des métadonnées du service, puis au moment de l’exécution, le client peut authentifier l’identité du service. Le concept d’identité de service consiste à autoriser un client à authentifier un service avant d’appeler une de ses opérations, protégeant ainsi le client contre les appels non authentifiés. Sur une connexion sécurisée, le service authentifie également les informations d’identification d’un client avant de l’autoriser à accéder, mais ce n’est pas le focus de cet exemple. Consultez les exemples du client qui montrent l’authentification du serveur.

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 les fonctionnalités suivantes :

  • Comment définir les différents types d’identité sur différents points de terminaison d’un service. Chaque type d’identité a des fonctionnalités différentes. Le type d'identité à utiliser dépend du type d'informations d'identification de sécurité utilisé sur la liaison du point de terminaison.

  • L’identité peut être définie de manière déclarative dans la configuration ou impérativement dans le code. En règle générale, pour le client et le service, vous devez utiliser la configuration pour définir l’identité.

  • Comment définir une identité personnalisée sur le client. Une identité personnalisée est généralement une personnalisation d’un type d’identité existant qui permet au client d’examiner d’autres informations de revendication fournies dans les informations d’identification du service pour prendre des décisions d’autorisation avant d’appeler le service.

    Remarque

    Cet exemple vérifie l’identité d’un certificat spécifique appelé identity.com et la clé RSA contenue dans ce certificat. Lorsque vous utilisez les types d’identité Certificate et RSA dans la configuration sur le client, un moyen simple d’obtenir ces valeurs consiste à inspecter WSDL pour le service où ces valeurs sont sérialisées.

L’exemple de code suivant montre comment configurer l’identité d’un point de terminaison de service avec le serveur de noms de domaine (DNS) d’un certificat à l’aide d’un WSHttpBinding.

//Create a service endpoint and set its identity to the certificate's DNS
WSHttpBinding wsAnonbinding = new WSHttpBinding (SecurityMode.Message);
// Client are Anonymous to the service
wsAnonbinding.Security.Message.ClientCredentialType = MessageCredentialType.None;
WServiceEndpoint ep = serviceHost.AddServiceEndpoint(typeof(ICalculator),wsAnonbinding, String.Empty);
EndpointAddress epa = new EndpointAddress(dnsrelativeAddress,EndpointIdentity.CreateDnsIdentity("identity.com"));
ep.Address = epa;

L’identité peut également être spécifiée dans la configuration dans le fichier App.config. L’exemple suivant montre comment configurer l’identité UPN (nom d’utilisateur principal) pour un point de terminaison de service.

<endpoint address="upnidentity"
        behaviorConfiguration=""
        binding="wsHttpBinding"
        bindingConfiguration="WSHttpBinding_Windows"
        name="WSHttpBinding_ICalculator_Windows"
        contract="Microsoft.ServiceModel.Samples.ICalculator">
  <!-- Set the UPN identity for this endpoint -->
  <identity>
      <userPrincipalName value="host\myservice.com" />
  </identity >
</endpoint>

Une identité personnalisée peut être définie sur le client en dérivant des classes EndpointIdentity et IdentityVerifier. Conceptuellement, la IdentityVerifier classe peut être considérée comme l’équivalent client de la classe du AuthorizationManager service. L’exemple de code suivant montre une implémentation de OrgEndpointIdentity, qui stocke un nom d’organisation à mettre en correspondance dans le nom de l’objet du certificat du serveur. La vérification d’autorisation pour le nom de l’organisation se produit dans la CheckAccess méthode sur la CustomIdentityVerifier classe.

// This custom EndpointIdentity stores an organization name
public class OrgEndpointIdentity : EndpointIdentity
{
    private string orgClaim;
    public OrgEndpointIdentity(string orgName)
    {
        orgClaim = orgName;
    }
    public string OrganizationClaim
    {
        get { return orgClaim; }
        set { orgClaim = value; }
    }
}

//This custom IdentityVerifier uses the supplied OrgEndpointIdentity to
//check that X.509 certificate's distinguished name claim contains
//the organization name e.g. the string value "O=Contoso"
class CustomIdentityVerifier : IdentityVerifier
{
    public override bool CheckAccess(EndpointIdentity identity, AuthorizationContext authContext)
    {
        bool returnvalue = false;
        foreach (ClaimSet claimset in authContext.ClaimSets)
        {
            foreach (Claim claim in claimset)
            {
                if (claim.ClaimType == "http://schemas.microsoft.com/ws/2005/05/identity/claims/x500distinguishedname")
                {
                    X500DistinguishedName name = (X500DistinguishedName)claim.Resource;
                    if (name.Name.Contains(((OrgEndpointIdentity)identity).OrganizationClaim))
                    {
                        Console.WriteLine("Claim Type: {0}",claim.ClaimType);
                        Console.WriteLine("Right: {0}", claim.Right);
                        Console.WriteLine("Resource: {0}",claim.Resource);
                        Console.WriteLine();
                        returnvalue = true;
                    }
                }
            }
        }
        return returnvalue;
    }
}

Cet exemple utilise un certificat appelé identity.com qui se trouve dans le dossier de solution Identity spécifique à la langue.

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.

  3. Pour exécuter l’exemple dans une configuration monoposte ou multiposte, suivez les instructions de Exécution des exemples Windows Communication Foundation.

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

  1. Sur Windows XP ou Windows Vista, importez le fichier de certificat Identity.pfx du dossier de solution Identity dans le magasin de certificats LocalMachine/My (Personal) à l’aide de l’outil enfichable MMC. Ce fichier est protégé par mot de passe. Pendant l’importation, vous êtes invité à indiquer un mot de passe. Entrez xyz dans le champ du mot de passe. Pour plus d’informations, consultez Comment : Afficher des certificats à l’aide du composant logiciel enfichable MMC. Une fois cette opération effectuée, exécutez Setup.bat dans une invite de commandes développeur de Visual Studio avec des privilèges d’administrateur. Cela copie ce certificat dans le magasin CurrentUser/TrustedPeople pour utilisation sur le client.

  2. Sur Windows Server 2003, exécutez Setup.bat à partir du dossier d'installation d'exemple dans une invite de commandes Visual Studio 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 fenêtre de commande Visual Studio. La variable d’environnement PATH définie dans l’invite de commandes Visual Studio pointe vers le répertoire qui contient des exécutables requis par le script Setup.bat. Vérifiez que vous supprimez les certificats en exécutant Cleanup.bat une fois l’exemple terminé. D’autres exemples de sécurité utilisent les mêmes certificats.

  3. Lancez Service.exe à partir du répertoire \service\bin. Vérifiez que le service indique qu’il est prêt et affiche une invite pour appuyer <sur Entrée> pour arrêter le service.

  4. Lancez Client.exe à partir du répertoire \client\bin ou en appuyant sur F5 dans Visual Studio pour générer et exécuter. 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. Avant de générer la partie client de l’exemple, veillez à modifier la valeur de l’adresse de point de terminaison du service dans le fichier Client.cs dans la CallServiceCustomClientIdentity méthode. Puis générez l'exemple.

  2. Créez un répertoire sur l’ordinateur de service.

  3. Copiez les fichiers de programme de service à partir de service\bin dans le répertoire sur l’ordinateur de service. Copiez également les fichiers Setup.bat et Cleanup.bat sur l’ordinateur de service.

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

  5. 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.

  6. Sur le service, 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.

  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. Il existe plusieurs instances qui doivent être modifiées.

  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 de service, lancez Service.exe à partir d'une invite de commandes.

  11. 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.