Service Identity, exemple
Cet exemple 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 miment de l'exécution, il peut authentifier l'identité du service. Le concept d'identité de service consiste à permettre à un client d'authentifier un service avant d'appeler l'une de ses opérations, ce qui protège 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 lui autoriser l'accès, mais ce n'est pas l'objet traité dans cet exemple. Pour plus d'informations sur l'authentification du serveur, consultez les exemples indiqués dans Exemples de clients.
Remarque : |
---|
La procédure d'installation ainsi que les instructions de génération relatives à cet exemple figurent à la fin de cette rubrique. |
Cet exemple illustre les fonctionnalités suivantes :
- Comment définir les divers types d'identité sur différents points de terminaison d'un service. Chaque type d'identité possède 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 façon déclarative dans la configuration ou de façon impérative dans le code. Pour le client et le service, vous devez généralement utiliser la configuration.
- Comment définir une identité personnalisée sur le client Une identité personnalisée est en général 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 afin de 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. Lors de l'utilisation des types d'identité Certificat et RSA dans la configuration sur le client, l'une des méthodes utilisées pour obtenir facilement ces valeurs consiste à inspecter le WSDL du service dans lequel 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 DNS (Domain Name Server) d'un certificat à l'aide de 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 définir l'identité UPN (User Principal Name, 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. D'un point de vue conceptuel, la classe IdentityVerifier peut être considérée comme étant l'équivalent client de la classe AuthorizationManager du service. L'exemple de code suivant présente une implémentation de OrgEndpointIdentity, qui stocke un nom d'organisation à faire correspondre au nom du sujet du certificat du serveur. Le contrôle d'autorisation du nom d'organisation se produit dans la méthode CheckAccess sur la classe CustomIdentityVerifier.
// 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 == "https://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 est situé dans le dossier de solution Identity correspondant à votre langue.
Pour configurer, générer et exécuter l'exemple
Assurez-vous d'avoir effectué la procédure indiquée dans la section Procédure d'installation unique pour les exemples Windows Communication Foundation.
Pour générer l'édition C# ou Visual Basic .NET de la solution, suivez les instructions indiquées dans Génération des exemples Windows Communication Foundation.
Pour exécuter l'exemple dans une configuration à un ou plusieurs ordinateurs, suivez les instructions indiquées dans Exécution des exemples Windows Communication Foundation.
Pour exécuter l'exemple sur le même ordinateur
Assurez-vous que le chemin d'accès contient le dossier dans lequel Makecert.exe et FindPrivateKey.exe se trouvent.
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. Lors de l'importation, un mot de passe vous est demandé. Tapez xyz dans la zone de mot de passe. Pour plus d'informations, consultez la rubrique How to: View Certificates with the MMC Snap-in. Ceci fait, exécutez Setup.bat, qui copie ce certificat dans le magasin CurrentUser/Trusted People pour une utilisation sur le client.
Sur Windows Server 2003, exécutez Setup.bat à partir du dossier d'installation de l'exemple. Tous les certificats requis pour l'exécution de l'exemple sont ainsi installés.
Remarque : Assurez-vous d'effacer les certificats en exécutant Cleanup.bat une fois l'exemple terminé. D'autres exemples de sécurité utilisent ces mêmes certificats. Lancez Service.exe à partir du répertoire de \service\bin. Vérifiez que le service indique qu'il est prêt et affiche une invite avant d'appuyer sur <Enter> pour terminer le service.
Lancez Client.exe à partir du répertoire \client\bin ou en appuyant sur F5 dans Visual Studio pour effectuer la génération et l'exécution. L'activité du client s'affiche sur son application de console.
Si le client et le service ne parviennent pas à communiquer, consultez Conseils de dépannage.
Pour exécuter l'exemple sur plusieurs ordinateurs
Avant de générer la partie cliente de l'exemple, modifiez la valeur de l'adresse de point de terminaison du service du fichier Client.cs dans la méthode
CallServiceCustomClientIdentity
. Puis générez l'exemple.Créez un répertoire sur l'ordinateur de service.
Copiez les fichiers programme du service 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.
Créez un répertoire sur l'ordinateur client pour les fichiers binaires du client.
Copiez les fichiers programme du client dans le répertoire client sur l'ordinateur client. Copiez également les fichiers Setup.bat, Cleanup.bat et ImportServiceCert.bat sur le client.
Sur le service, exécutez
setup.bat service
. L'exécution desetup.bat
avec l'argumentservice
crée un certificat de service portant le nom de domaine complet de l'ordinateur, puis exporte ce certificat vers un fichier appelé Service.cer.Copiez le fichier Service.cer du répertoire de service dans le répertoire client sur l'ordinateur client.
Dans le fichier Client.exe.config de l'ordinateur client, modifiez la valeur d'adresse du point de terminaison afin qu'elle corresponde à la nouvelle adresse de votre service. Plusieurs instances doivent être modifiées.
Sur le client, exécutez ImportServiceCert.bat. Cette opération importe le certificat de service du fichier Service.cer dans le magasin CurrentUser - TrustedPeople.
Sur l'ordinateur de service, lancez Service.exe à partir d'une invite de commandes.
Sur l'ordinateur client, lancez Client.exe à partir d'une invite de commandes. Si le client et le service ne parviennent pas à communiquer, consultez Conseils de dépannage.
Pour procéder au nettoyage après exécution de l'exemple
Exécutez Cleanup.bat dans le dossier d'exemples après avoir exécuté l'exemple.
Remarque : Ce script ne supprime pas les certificats de service sur un client lors de l'exécution de cet exemple sur plusieurs ordinateurs. Si vous avez exécuté des exemples Windows Communication Foundation (WCF) qui utilisent des certificats sur plusieurs ordinateurs, assurez-vous d'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
.
Send comments about this topic to Microsoft.
© 2007 Microsoft Corporation. All rights reserved.