Partager via


Identité du service et authentification

L'identité du point de terminaison d'un service est une valeur générée à partir du service WSDL (Web Services Description Language). Cette valeur, propagée à tout client, est utilisée pour authentifier le service. Une fois que le client a initialisé une communication à un point de terminaison et le service s'authentifie au client, le client compare la valeur de l'identité du point de terminaison avec la valeur réelle que le processus d'authentification du point de terminaison a retournée. Si elles correspondent, le client est assuré qu'il a contacté le point de terminaison du service attendu. Cela sert de protection contre le hameçonnage et évite qu'un client soit redirigé à un point de terminaison hébergé par un service malveillant.

Pour un exemple d'application illustrant le paramètre d'identité, consultez Service Identity, exemple. Pour plus d'informations sur le sujet suivant les points de terminaison et les adresses de point de terminaison, consultez Adresses de point de terminaison.

ms733130.note(fr-fr,VS.100).gifRemarque :
Lorsque vous utilisez NT LanMan (NTLM) pour l'authentification, l'identité du service n'est pas vérifiée parce que, sous NTLM, le client ne peut pas authentifier le serveur. NTLM est utilisé lorsque les ordinateurs font partie d'un groupe de travail Windows, ou lors de l'exécution d'une version antérieure de Windows qui ne prend pas en charge l'authentification Kerberos.

Lorsque le client initialise un canal sécurisé pour envoyer un message à un service, l'infrastructure Windows Communication Foundation (WCF) authentifie le service et envoie le message uniquement si l'identité du service correspond à l'identité spécifiée dans l'adresse du point de terminaison que le client utilise.

Le traitement de l'identité inclut les étapes suivantes :

  • Au moment du design, le développeur d'applications détermine l'identité du service à partir des métadonnées du point de terminaison (exposé à travers WSDL).

  • Pendant l'exécution, l'application cliente vérifie les revendications des informations d'identification de sécurité du service avant d'envoyer des messages au service.

Le traitement de l'identité sur le client est analogue à l'authentification du client sur le service. Un service sécurisé n'exécute pas de code jusqu'à ce que les informations d'identification du client aient été authentifiées. De la même façon, le client n'envoie pas de messages au service jusqu'à ce que les informations d'identification du service aient été authentifiées sur la base de ce qui est déjà connu via métadonnées du service.

La propriété Identity de la classe EndpointAddress représente l'identité du service appelé par le client. Le service publie Identity dans ses métadonnées. Lorsque le développeur d'applications exécute Outil Service Model Metadata Tool (Svcutil.exe) pour le point de terminaison du service, la configuration générée contient la valeur de la propriété Identity du service. L'infrastructure WCF (en cas de configuration sécurisée) vérifie que le service possède l'identité spécifiée.

ms733130.Important(fr-fr,VS.100).gif Remarque :
Les métadonnées contiennent l'identité attendue du service, il est par conséquent recommandé d'exposer les métadonnées du service de manière sécurisée, par exemple, en créant un point de terminaison HTTPS. Pour plus d'informations, consultez How to: Secure Metadata Endpoints.

Types d'identité

Un service peut fournir cinq types d'identités. Chaque type d'identité correspond à un élément qui peut être contenu à l'intérieur de l'élément <identity> dans la configuration. Le type utilisé dépend du scénario et des spécifications de sécurité du service. Le tableau suivant décrit chaque type d'identité.

Type d'identité Description Scénario typique

DNS (Domain Name System)

Utilisez cet élément avec les certificats X.509 ou les comptes Windows. Il compare le nom DNS spécifié dans l'information d'identification avec la valeur spécifiée dans cet élément.

Un contrôle DNS vous permet d'utiliser des certificats avec les noms DNS ou de sujet. Si un certificat est réédité avec le même nom DNS ou de sujet, le contrôle d'identité est encore valide. Lorsqu'un certificat est réédité, il obtient une nouvelle clé RSA mais conserve le même nom DNS ou de sujet. Cela signifie que les clients n'ont pas à mettre à jour les informations d'identité relatives du service.

Certificat. Il s'agit de la valeur par défaut lorsque la valeur de certificat a été attribuée à la propriété ClientCredentialType.

Cet élément spécifie une valeur de certificat X.509 encodée en base 64 qui sera comparée avec le client.

Utilisez également cet élément en cas d'utilisation d'un CardSpace comme information d'identification pour authentifier le service.

Cet élément restreint l'authentification à un certificat unique basé sur sa valeur d'empreinte numérique. Cela permet une authentification plus stricte parce que les valeurs d'empreinte numérique sont uniques. Il convient cependant de noter que si le certificat est réédité avec le même nom de sujet, il a également une nouvelle empreinte numérique. Par conséquent, les clients ne sont pas en mesure de valider le service à moins que la nouvelle empreinte numérique soit connue. Pour plus d'informations sur le sujet suivant la recherche d'empreinte numérique d'un certificat, consultez Comment : récupérer l'empreinte numérique d'un certificat.

Référence de certificat

Identique à l'option de certificat décrite précédemment. Toutefois, cet élément vous permet de spécifier un nom de certificat et l'emplacement du magasin à partir duquel vous pouvez le récupérer.

Identique au scénario de certificat décrit précédemment.

L'avantage est que l'emplacement du magasin du certificat peut changer.

RSA

Cet élément spécifie une valeur de clé RSA à comparer avec le client. Il est similaire à l'option de certificat mais la clé RSA est utilisée au lieu de l'empreinte numérique du certificat.

Un contrôle RSA vous permet de restreindre spécifiquement l'authentification à un certificat unique en fonction de sa clé RSA. Cela permet l'authentification plus stricte d'une clé RSA spécifique aux dépens du service, qui n'utilise plus les clients existants lorsque la valeur de clé RSA est modifiée.

Nom d'utilisateur principal (UPN). Il s'agit de la valeur par défaut lorsque la valeur Windows est attribuée à ClientCredentialType et le processus du service ne s'exécute pas sous l'un des comptes système.

Cet élément spécifie l'UPN sous lequel le service s'exécute. Consultez la section Protocole et identité Kerberos de Substitution de l'identité d'un service pour l'authentification.

Cela garantit que le service s'exécute sous un compte d'utilisateur Windows spécifique. Le compte d'utilisateur peut être l'utilisateur actuellement connecté ou le service qui s'exécute sous un compte d'utilisateur particulier.

Ce paramètre tire parti de la sécurité Windows Kerberos si le service s'exécute sous un compte de domaine dans un environnement Active Directory.

Nom de principal du service (SPN). Valeur par défaut lorsque le ClientCredentialType a la valeur Windows et le processus du service s'exécute sous l'un des comptes système LocalService, LocalSystem ou NetworkService.

Cet élément spécifie le SPN associé au compte du service. Consultez la section Protocole et identité Kerberos de Substitution de l'identité d'un service pour l'authentification.

Cela garantit que le SPN et le compte Windows spécifique, associé au SPN, identifient le service.

Vous pouvez utiliser l'outil Setspn.exe pour associer un compte d'ordinateur pour le compte d'utilisateur du service.

Ce paramètre tire parti de la sécurité Windows Kerberos si le service s'exécute sous l'un des comptes système ou sous un compte de domaine qui a un nom SPN associé et si l'ordinateur est un membre d'un domaine dans un environnement Active Directory.

Spécification de l'identité au service

Généralement, vous n'avez pas à définir l'identité sur un service parce que la sélection du type d'information d'identification du client dicte le type d'identité exposé dans les métadonnées du service. Pour plus d'informations sur le sujet suivant comment substituer ou spécifier l'identité du service, consultez Substitution de l'identité d'un service pour l'authentification.

Utilisation de l'élément <identity> dans la configuration

Si vous remplacez le type d'information d'identification du client dans la liaison présentée précédemment par Certificate,, alors le fichier WSDL généré contient un certificat X.509 sérialisé en base 64 pour la valeur d'identité, tel qu'indiqué dans le code suivant. Il s'agit de la valeur par défaut pour tous les types d'informations d'identification du client autres que Windows.

<Identity xmlns="https://schemas.xmlsoap.org/ws/2006/02/addressingidentity">
<KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
 <X509Data>
 <X509Certificate>MIIBxjCCAXSgAwIBAgIQmXJgyu9tro1M98GifjtuoDAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTA2MDUxNzIxNDQyNVoXDTM5MTIzMTIzNTk1OVowKTEQMA4GA1UEChMHQ29udG9zbzEVMBMGA1UEAxMMaWRlbnRpdHkuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDBmivcb8hYbh11hqVoDuB7zmJ2y230f/b4e+4P6yXtKKuhUdYcIqc8mAforIM4WWJEVGeJVq9sFEwqrL5Ryid8jMTRwPLvA/x/wvj1gtD1GWJ+aUh2pqieiGL7MWTepHAQBIibUxgOrAOz0j9Xhg0iDFYScdYUjeqI3yZIDC7WbwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBADB/J2QjdSPL8Doj3pAveCXd/5fY03eo9kUym/Tmb4ubdqsObri0qnYR/n8Wxsa1yJ4Dks6cNBTPS4l5B7zUeNo=</X509Certificate> 
 </X509Data>
</KeyInfo>
</Identity>

Vous pouvez modifier la valeur de l'identité de service par défaut ou le type de l'identité à l'aide de l'élément <identity> dans la configuration ou en définissant l'identité dans le code. Le code de configuration suivant affecte à une identité DNS (Domain Name System) la valeur contoso.com.

Définition de l'identité par programme

Votre service n'a pas besoin de spécifier une identité de manière explicite, car WCF la détermine automatiquement. Toutefois, WCF vous permet de spécifier une identité sur un point de terminaison, le cas échéant. Le code suivant ajoute un nouveau point de terminaison du service avec une identité DNS spécifique.

Dim ep As ServiceEndpoint = myServiceHost.AddServiceEndpoint(GetType(ICalculator), New WSHttpBinding(), String.Empty)
Dim myEndpointAdd As New EndpointAddress(New Uri("https://localhost:8088/calc"), EndpointIdentity.CreateDnsIdentity("contoso.com"))
ep.Address = myEndpointAdd
ServiceEndpoint ep = myServiceHost.AddServiceEndpoint(
                typeof(ICalculator),
                new WSHttpBinding(),
                String.Empty);
EndpointAddress myEndpointAdd = new EndpointAddress(new Uri("https://localhost:8088/calc"),
     EndpointIdentity.CreateDnsIdentity("contoso.com"));
ep.Address = myEndpointAdd;

Spécification de l'identité au client

Au moment du design, un développeur d'applications utilise en général Outil Service Model Metadata Tool (Svcutil.exe) pour générer la configuration client. Le fichier de configuration généré (prévu pour une utilisation par le client) contient l'identité du serveur. Par exemple, le code suivant est généré à partir d'un service qui spécifie une identité DNS, comme illustré dans l'exemple précédent. Notez que la valeur de l'identité du point de terminaison du client correspond à celle du service. Dans ce cas, lorsque le client reçoit les informations d'identification Windows (Kerberos) pour le service, il s'attend à ce que la valeur soit contoso.com.

<configuration>
<system.serviceModel>
  <bindings>
    <wsHttpBinding>
      <binding name="WSHttpBinding_ICalculator_Windows">
        <security>
          <message clientCredentialType="Windows"/>
        </security>
      </binding>
    </wsHttpBinding>
  </bindings>
  <client>
    <endpoint address="https://localhost:8003/servicemodelsamples/service/dnsidentity"
      binding="wsHttpBinding"
      bindingConfiguration="WSHttpBinding_ICalculator_Windows"
      contract="ICalculator"
      name="WSHttpBinding_ICalculator">
      <identity>
        <dns value="contoso.com" />
      </identity>
    </endpoint>
  </client>
</system.serviceModel>
</configuration>

Si, au lieu de Windows, le service spécifie un certificat pour le type d'information d'identification du client, alors, la propriété DNS du certificat est supposée être la valeur contoso.com. (Ou si la propriété DNS est Null, le nom de sujet du certificat doit être contoso.com.)

Utilisation d'une valeur spécifique pour l'identité

Le fichier de configuration client suivant illustre comment l'identité du service est supposée être une valeur spécifique. Dans l'exemple suivant, le client peut communiquer avec deux points de terminaison. Le premier est identifié par une empreinte numérique de certificat et le second par une clé RSA de certificat. Autrement dit, il s'agit d'un certificat qui contient uniquement une paire clé publique/clé privée, mais n'est pas publié par une autorité approuvée.

<configuration>
<system.serviceModel>
  <bindings>
    <wsHttpBinding>
      <binding name="WSHttpBinding_ICalculator_Anonymous">
        <security>
          <message clientCredentialType="None" />
        </security>
      </binding >
      </wsHttpBinding>
  </bindings>
  <client>
    <endpoint   
address="https://localhost:8003/servicemodelsamples/service/certificateidentity"
        binding="wsHttpBinding"
        bindingConfiguration="WSHttpBinding_ICalculator_Anonymous"
        contract="ICalculator"
        name="WSHttpBinding_ICalculator1">
      <identity>
        <certificate encodedValue="AwAAAAEAAAAUAAAARwEDOI5fk5i0+TbylJ9k8Kljle8gAAAAAQAAAMoBAAAwggHGMIIBdKADAgECAhCZcmDK722ujUz3waJ+O26gMAkGBSsOAwIdBQAwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3kwHhcNMDYwNTE3MjE0NDI1WhcNMzkxMjMxMjM1OTU5WjApMRAwDgYDVQQKEwdDb250b3NvMRUwEwYDVQQDEwxpZGVudGl0eS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMGaK9xvyFhuHXWGpWgO4HvOYnbLbfR/9vh77g/rJe0oq6FR1hwipzyYB+isgzhZYkRUZ4lWr2wUTCqsvlHKJ3yMxNHA8u8D/H/C+PWC0PUZYn5pSHamqJ6IYvsxZN6kcBAEiJtTGA6sA7PSP1eGDSIMVhJx1hSN6ojfJkgMLtZvAgMBAAGjSzBJMEcGA1UdAQRAMD6AEBLkCS0GHR1PAI1hIdwWZGOhGDAWMRQwEgYDVQQDEwtSb290IEFnZW5jeYIQBjdsAKoAZIoRz7jUqlw19DAJBgUrDgMCHQUAA0EAMH8nZCN1I8vwOiPekC94Jd3/l9jTd6j2RTKb9OZvi5t2qw5uuLSqdhH+fxbGxrXIngOSzpw0FM9LiXkHvNR42g==" />
      </identity>
    </endpoint>
    <endpoint address="https://localhost:8003/servicemodelsamples/service/rsaidentity"
        binding="wsHttpBinding"
        bindingConfiguration="WSHttpBinding_ICalculator_Anonymous"
        contract="ICalculator" 
        name="WSHttpBinding_ICalculator2">
      <identity>
        <rsa value="&lt;RSAKeyValue&gt;&lt;Modulus&gt;wZor3G/IWG4ddYalaA7ge85idstt9H/2+HvuD+sl7SiroVHWHCKnPJgH6KyDOFliRFRniVavbBRMKqy+UconfIzE0cDy7wP8f8L49YLQ9RlifmlIdqaonohi+zFk3qRwEASIm1MYDqwDs9I/V4YNIgxWEnHWFI3qiN8mSAwu1m8=&lt;/Modulus&gt;&lt;Exponent&gt;AQAB&lt;/Exponent&gt;&lt;/RSAKeyValue&gt;" />
      </identity>
    </endpoint>
  </client>
</system.serviceModel>
</configuration>

Contrôle d'identité au moment de l'exécution

Au moment du design, un développeur d'applications détermine l'identité du serveur via ses métadonnées. Pendant l'exécution, le contrôle d'identité est effectué avant d'appeler un point de terminaison sur le service.

La valeur d'identité est attachée au type d'authentification spécifié par les métadonnées, en d'autres termes, le type d'information d'identification utilisé pour le service.

Si le canal est configuré pour authentifier à l'aide du message ou d'un SSL (Secure Sockets Layer) au niveau du transport avec des certificats X.509 pour l'authentification, les valeurs d'identité suivantes sont valides :

  • DNS. WCF garantit que le certificat fourni pendant la négociation SSL contient un DNS ou un attribut CommonName (CN) égal à la valeur spécifiée dans l'identité DNS sur le client. Notez que ces contrôles sont complémentaires à la détermination de la validé du certificat du serveur. Par défaut, WCF garantit que le certificat du serveur est publié par une autorité racine approuvée.

  • Certificat. Pendant la négociation SSL, WCF garantit que le point de terminaison distant fournit la valeur de certificat exacte spécifiée dans l'identité.

  • Référence de certificat. Identique au certificat.

  • RSA. Pendant la négociation SSL, WCF garantit que le point de terminaison distant fournit la clé RSA exacte spécifiée dans l'identité.

Si le service authentifie en utilisant le message - ou un SSL au niveau du transport avec des informations d'identification Windows pour l'authentification, et négocie l'information d'identification, les valeurs d'identité suivantes sont valides :

  • DNS. La négociation passe le SPN du service afin que le nom DNS puisse être vérifié. Le SPN se présente sous la forme host/<dns name>.

  • SPN. Un service SPN explicite est retourné, par exemple, host/myservice.

  • UPN. L'UPN du compte de service. L'UPN se présente sous la forme username@domain. Par exemple, lorsque le service s'exécute dans un compte d'utilisateur, cela peut être username@contoso.com.

La spécification de l'identité par programmation (à l'aide de la propriété Identity ) est facultative. Si aucune identité n'est spécifiée et si le type d'information d'identification du client est Windows, la valeur par défaut est SPN et la valeur définie dans la partie correspondant au nom d'hôte de l'adresse du point de terminaison du service est préfixée avec la valeur littérale "host/". Si aucune identité n'est spécifiée et si le type d'information d'identification du client est un certificat, la valeur par défaut est Certificate. Cela s'applique à la fois à la sécurité au niveau du message et au niveau du transport.

Identité et liaisons personnalisées

Parce que l'identité d'un service dépend du type de liaison utilisé, assurez-vous qu'une identité appropriée est exposée lors de la création d'une liaison personnalisée. Par exemple, dans l'exemple de code suivant, l'identité exposée n'est pas compatible avec le type de sécurité parce que l'identité de la liaison de démarrage de conversation sécurisée ne correspond pas à l'identité de la liaison sur le point de terminaison. La liaison de conversation sécurisée définit l'identité DNS, tandis que WindowsStreamSecurityBindingElement définit l'identité UPN ou SPN.

Dim binding As New CustomBinding()
' The following binding exposes a DNS identity.
binding.Elements.Add(SecurityBindingElement.CreateSecureConversationBindingElement(SecurityBindingElement.CreateIssuedTokenForSslBindingElement(New IssuedSecurityTokenParameters())))

' The following element requires a UPN or SPN identity.
binding.Elements.Add(New WindowsStreamSecurityBindingElement())
binding.Elements.Add(New TcpTransportBindingElement())
CustomBinding binding = new CustomBinding();
// The following binding exposes a DNS identity.
binding.Elements.Add(SecurityBindingElement.
    CreateSecureConversationBindingElement(
    SecurityBindingElement.
    CreateIssuedTokenForSslBindingElement(
    new IssuedSecurityTokenParameters())));

// The following element requires a UPN or SPN identity.
binding.Elements.Add(new WindowsStreamSecurityBindingElement());
binding.Elements.Add(new TcpTransportBindingElement());

Pour plus d'informations sur le sujet suivant comment empiler correctement des éléments de liaison pour une liaison personnalisée, consultez Création de liaisons définies par l'utilisateur. Pour plus d'informations sur le sujet suivant la création d'une liaison personnalisée avec SecurityBindingElement, consultez Comment : créer un SecurityBindingElement pour un mode d'authentification spécifié.

Voir aussi

Tâches

Comment : créer un SecurityBindingElement pour un mode d'authentification spécifié
Comment : créer un vérificateur d'identité du client personnalisé
Comment : récupérer l'empreinte numérique d'un certificat

Concepts

Comment : créer une liaison personnalisée à l'aide de SecurityBindingElement
Sélection d'un type d'informations d'identification
Utilisation des certificats
Outil Service Model Metadata Tool (Svcutil.exe)
Création de liaisons définies par l'utilisateur