Traduction

Cet article est la traduction la plus fidèle possible de l'article original d'Eric White, Establishing Trust between a WCF Web Service and the SharePoint 2010 Security Token Service.

Introduction

Cet article est le troisième d'une série d'articles en quatre parties qui montre comment créer un service Web prenant en charge les revendications et comment le consommer à partir de SharePoint Business Connectivity Services. Dans le premier article de la série, nous avons vu comment créer un service Web, que nous avons compilé et que nous avons hébergé sous IIS. Dans le deuxième article de la série, nous avons amélioré le service Web WCF que nous avions créé dans la première partie, en ajoutant du code qui utilise WIF pour déterminer l'identité de l'appelant. Cette dernière a ensuite été écrite dans un fichier journal. Dans cet article, nous utiliserons Business Connectivity Services (BCS) pour nous connecter à et consommer ce service Web.

Vous pouvez consulter les autres articles de la série ici.

Prise en main de la création d'un service Web WCF Montre comment créer un service Web très simple en utilisant WCF. Montre comment héberger ce service Web en utilisant IIS.
Détermination de l'identité de l'appelant au sein du service Web WCF Améliore l'exemple développé dans l'article précédent de sorte que le service Web puisse rapporter sur l'identité de son appelant de manière rigoureuse.
Établissement de la confiance entre un service Web WCF et le Security Token Service de SharePoint 2010
(le présent article)
Configure l'exemple développé dans l'article précédent de sorte qu'il utilise un certificat auto-signé pour prendre en charge une connexion sécurisée.
Consommation d'un service Web WCF prenant en charge les revendications en tant que type de contenu externe SharePoint 2010 Examine pas à pas la procédure pour la consommation d'un service Web prenant en charge les revendications en tant que type de contenu externe SharePoint 2010.

Établissement de la confiance entre un service Web WCF et le Security Token Service de SharePoint 2010

Dans cet article nous allons activer la liaison fédérée avec HTTP pour le service Web et établir la confiance entre le service Web WCF et le Security Token Service de SharePoint 2010.

Chaque installation serveur de SharePoint possède son propre service d'émission de jeton de sécurité. Tandis qu'il est possible d'établir des relations de confiance avec des services d'émission de jeton de sécurité qui ne font pas partie d'une installation SharePoint, le scénario le plus courant est de loin celui dans lequel vous établissez une relation de confiance avec le Security Token Service (STS) de SharePoint, par conséquent, cet article se concentre sur ce scénario.

Pour suivre les procédures indiquées dans cet article, vous devez disposer de deux serveurs configurés. L'un des serveurs doit être en train d'exécuter le service Web WCF que vous avez développé dans les deux premiers articles de cette série. L'autre doit posséder une instance installée et en cours d'exécution de SharePoint Server 2010. J'ai testé ces procédures sur une instance de SharePoint Server 2010 nouvellement installée.

Le diagramme suivant indique les différents acteurs de ce scénario. L'utilisateur se connecte au « front end » Web (WFE), qui communique avec le Runtime BDC (Business Data Connectivity). Le runtime du BDC appelle le Security Token Service (STS) de SharePoint et le service Web.

Image non disponible

Créer un certificat auto-signé

Si vous possédez déjà un certificat valide émis par une autorité de certification, vous pouvez alors utiliser ce certificat au lieu de créer un certificat auto-signé.

  1. Démarrez le Gestionnaire Internet Information Services (IIS). Cliquez sur Démarrer > Outils d'administration > Gestionnaire Internet Information Services (IIS).
  2. Sélectionnez la machine dans le volet Connexions. Double-cliquez sur Certificats de serveur.
    Image non disponible
  3. Cliquez sur Créer un certificat auto-signé.
    Image non disponible
  4. L'Assistant vous demandera de spécifier un nom convivial. Il est utile de lui fournir un nom qui indique la machine d'où le certificat a été issu. Dans mon cas, je lui ai fourni le nom de l'ordinateur où est hébergé le service Web.
    Image non disponible

Lier le certificat à https

  1. Dans le Gestionnaire Internet Information Services (IIS), faites un clic droit sur le site qui contient l'application de service Web, puis cliquez sur Modifier les liaisons.
    Image non disponible
  2. Si vous avez suivi les procédures indiquées dans cette série et que vous avez demarré avec un système d'exploitation nouvellement installé, vous allez constater qu'il n'y point de liaison https. Cliquez sur Ajouter.
  3. Dans la boîte de dialogue Ajouter la liaison de site, sélectionnez https dans la liste déroulante Type.
    Image non disponible
  4. Ensuite, sélectionnez le certificat SSL que vous venez tout juste de créer.
    Image non disponible
  5. Cliquez sur le bouton Afficher... pour voir les détails à propos du certificat. En particulier, nous sommes intéressés par la propriété Objet.
    Image non disponible

    Notez la valeur du champ Objet, car vous en aurez besoin lorsque vous vous connecterez au service à l'aide de Microsoft SharePoint Designer 2010. Vous aurez besoin de cette valeur lors de la neuvième étape de la procédure indiquée dans le quatrième article de cette série.

  6. Cliquez sur OK, puis sur Fermer.

Ensuite, vous devez établir la confiance entre l'ordinateur qui consomme le service Web (le serveur SharePoint 2010) et l'ordinateur qui héberge le service Web WCF. Pour ce faire, vous exportez le certificat que vous venez de créer, vous le copiez sur l'ordinateur qui consomme le service Web, puis vous importez le certificat en utilisant un cmdlet PowerShell.

Exporter le certificat auto-signé

  1. Démarrez le Microsoft Management Console. La manière la plus facile est de saisir mmc dans la zone de recherche du menu Démarrer.
    Image non disponible
  2. Dans la console, sélectionnez Fichier > Ajouter/Supprimer un composant logiciel enfichable...
  3. Dans la boîte de dialogue Ajouter ou supprimer des composants logiciels enfichables, dans la liste Composants logiciels enfichables disponibles, cliquez sur Certificats. Cliquez, ensuite, sur le bouton Ajouter.
    Image non disponible
  4. Lorsque vous effectuez l'ajout, le Microsoft Management Console vous demande d'indiquer le compte pour lequel vous allez gérer les certificats. Cliquez sur Le compte de l'ordinateur, puis cliquez sur Suivant.
    Image non disponible
  5. Cliquez sur Terminer, puis cliquez sur OK.
  6. Maintenant, recherchez le certificat que vous venez de créer. Développez Certificats, puis Personnel, ensuite cliquez sur Certificats. Vous devrez trouver un certificat émis pour l'ordinateur sur lequel vous êtes, et émis par ce même ordinateur.
    Image non disponible
  7. Faites un clic droit sur le certificat, cliquez sur Toutes les tâches, puis cliquez sur Exporter. Cela démarre l'Assistant Exportation de certificat.
    Image non disponible
  8. Dans la boîte de dialogue de Bienvenue, cliquez sur Suivant.
  9. Dans la boîte de dialogue suivante, sélectionnez « Non, ne pas exporter la clé privée », puis cliquez sur Suivant.
  10. Dans la boîte de dialogue suivante, le paramètre par défaut est Binaire codé DER X.509 (.cer). Ne modifiez pas ce paramètre, et cliquez sur Suivant.
  11. Dans la boîte de dialogue suivante, spécifiez le chemin d'accès et le nom du fichier de certificat. Dans mon cas, le nom de l'ordinateur étant ericwhit209, j'ai nommé le certificat ericwhit209.cer. Cliquez sur Suivant.
  12. Cliquez sur Terminer. L'Assistant vous indiquera si l'exportation s'est effectuée avec succès ou non.

Maintenant que vous avez exporté le certificat auto-signé, vous devez copier ce certificat sur l'ordinateur qui exécute SharePoint Server 2010, et l'importer dans SharePoint.

Établir la confiance entre le service Web et le serveur SharePoint

Vous ne devez effectuer cette procédure que si vous utilisez un certificat auto-signé. Si vous utilisez un certificat émis par une autorité de certification, vous n'avez pas besoin de suivre les étapes indiquées dans cette procédure. Celle-ci active la validation du certificat lorsque BCS appelle le service Web en utilisant Https.

  1. Copiez le fichier de certificat depuis l'ordinateur qui héberge le service Web vers l'ordinateur qui héberge SharePoint Server 2010.

    Les étapes suivantes doivent être réalisées sur l'ordinateur qui héberge le serveur SharePoint.

  2. Démarrez SharePoint 2010 Management Shell. Exécutez l'outil en tant qu'administrateur.
    Image non disponible
  3. Accédez au répertoire dans lequel vous avez déposé le certificat lorsque vous l'avez copié depuis l'ordinateur qui héberge le service Web vers l'ordinateur qui heberge le serveur SharePoint.
    Image non disponible
  4. Placez le certificat dans une variable PowerShell, puis envoyez le certificat à l'autorité de certification racine approuvée SharePoint. Saisissez le code suivant dans la console PowerShell, en remplaçant par le nom que vous avez attribué au certificat lorsque vous l'avez exporté et copié.

    $cert = Get-PfxCertificate .\ericwhit209.cer
    New-SPTrustedRootAuthority -Certificate $cert -Name ericwhit209

    Image non disponible

    Une fois le certificat soumis, le cmdlet renverra quelque chose qui ressemble à ceci :

    Image non disponible

    Vous pouvez y voir le nom de l'émetteur, sa plage de validité, et diverses autres informations.

    Maintenant que https a été lié, vous pouvez mettre à jour le Web.config afin que le service Web WCF puisse l'utiliser. Toutefois, avant de pouvoir mettre à jour le Web.config, vous devez déterminer l'empreinte du certificat du Security Token Service (STS) de SharePoint sur l'ordinateur qui héberge le serveur SharePoint.

Déterminer l'empreinte du certificat du Security Token Service de SharePoint

Cette procédure et la procédure suivant celle-ci sont en fait celles qui établissent la confiance entre le STS SharePoint et le service Web.

  1. Sur la machine serveur qui est en train d'exécuter SharePoint Server 2010, démarrez le Microsoft Management Console, et ajoutez le composant logiciel enfichable du certificat.
  2. Développez Certificats, puis SharePoint. Cliquez sur le nœud Certificats.
    Image non disponible
  3. Le certificat qui nous intéresse est le premier de la liste émis pour le Security Token Service de SharePoint. Double-cliquez dessus.
  4. À la prochaine étape, vous devez copier l'empreinte du certificat dans le presse-papiers. Cette étape comporte une petite difficulté. Si vous copiez le premier espace qui apparaît dans la zone de texte, vous allez copier une marque d'ordre d'octet (BOM) invisible dans le presse-papiers à cet emplacement au sein de la chaîne. Vous devez veiller à sélectionner la chaîne de chiffres hexadécimaux sans sélectionner ce premier caractère.
    Image non disponible

    Copiez l'empreinte depuis la boîte de dialogue Certificat dans le presse-papiers.

  5. Supprimez les espaces du texte de l'empreinte. Le texte copié à partir du gestionnaire de Certificat est le suivant, avec des espaces séparant les octets hexadécimaux :

    dd be 98 f4 c2 db e6 d7 8c ec 14 d0 d0 0a b8 90 d1 53 08 f6

    Démarrez le Bloc-notes, collez-y le texte, puis supprimez les espaces afin que la chaîne soit comme suit :

    ddbe98f4c2dbe6d78cec14d0d00ab890d15308f6

    Il s'agit de l'une des empreintes dont vous aurez besoin à l'étape suivante.

    Vous pouvez vérifier que vous n'avez pas copié la marque d'ordre d'octet en essayant d'enregistrer le fichier avec le codage ANSI. Dans le Bloc-notes, sur le menu cliquez sur Fichier > Enregistrer sous, spécifiez un nom de fichier, puis cliquez sur Enregistrer.

    Image non disponible

    Si, comme il se doit, vous n'avez pas sélectionné le caractère qui contient la marque d'ordre d'octet (BOM), le fichier s'enregistrera correctement. Par contre, si vous avez à tort sélectionné la marque d'ordre d'octet (BOM), le Bloc-notes vous indiquera que le fichier contient des caractères au format Unicode qui seront perdus si vous enregistrez le fichier en tant que texte au codage ANSI.

    Image non disponible

    Copiez et enregistrez cette empreinte de manière a pouvoir la coller dans le Web.config pour le service Web.

Remplacer le Web.config pour le service Web

Ouvrez le projet pour le service Web dans Visual Studio. Remplacez Web.config par le contenu du listing suivant. Il y a quatre valeurs que vous allez devoir mettre à jour dans ce Web.config.

  1. Mettez à jour l'URL du point de terminaison pour le Security Token Service de SharePoint. Vous ne devez mettre à jour que le nom de l'ordinateur. Étant donné le nom de l'ordinateur, l'URL du point de terminaison pour le Security Token Service de SharePoint est bien connue.
  2. Mettez à jour l'URL de découverte de métadonnées pour le Security Token Service de SharePoint. Comme dans le cas de l'URL du point de terminaison, vous ne devez mettre à jour que le nom de l'ordinateur.
  3. Mettez à jour l'empreinte pour le Security Token Service de SharePoint avec la valeur que vous aviez déterminée plus tot dans cet article.
  4. Mettez à jour le nom du jeton de l'émetteur. Ce nom doit être unique parmi les émetteurs approuvés au sein du registre des noms d'émetteurs. Aux fins du présent article, utilisez le nom de serveur de l'ordinateur qui est en train d'héberger le service Web WCF.

À ce stade, le service Web est configuré correctement.

Web.config
Sélectionnez
<?xml version="1.0"?> <configuration>
  <configSections>
    <section name="microsoft.identityModel"
             type="Microsoft.IdentityModel.Configuration.MicrosoftIdentityModelSection, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
  </configSections>
  <system.serviceModel>
    <diagnostics>
      <messageLogging logEntireMessage="true"
                      logMalformedMessages="true"
                      logMessagesAtTransportLevel="true" />
    </diagnostics>
    <services>
      <service behaviorConfiguration="CustomersService.Service1Behavior"
               name="CustomersService.Customers">
        <endpoint address=""
                  binding="ws2007FederationHttpBinding"
                  contract="CustomersService.ICustomers"
                  bindingConfiguration="Customers_ws2007FedHttpBinding">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <endpoint address="mex"
                  binding="mexHttpBinding"
                  contract="IMetadataExchange" />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="CustomersService.Service1Behavior">
          <federatedServiceHostConfiguration name="CustomersService.Customers"/>
          <!-- To avoid disclosing metadata information, set the value below to false and
               remove the metadata endpoint above before deployment -->
          <serviceMetadata httpGetEnabled="true"/>
          <!-- To receive exception details in faults for debugging purposes, set the value
               below to true.  Set to false before deployment to avoid disclosing exception
               information -->
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <bindings>
      <customBinding>
        <binding name="AsymmetricWindowsHttpBinding">
          <security defaultAlgorithmSuite="Basic256Sha256"
                    authenticationMode="SspiNegotiated"
                    requireDerivedKeys="true"
                    securityHeaderLayout="Strict"
                    includeTimestamp="true"
                    keyEntropyMode="CombinedEntropy"
                    messageProtectionOrder="SignBeforeEncryptAndEncryptSignature"
                    messageSecurityVersion="WSSecurity11WSTrust13WSSecureConversation13WSSecurityPolicy12BasicSecurityProfile10"
                    requireSecurityContextCancellation="true"
                    requireSignatureConfirmation="false">
            <localClientSettings cacheCookies="true"
                                 detectReplays="true"
                                 replayCacheSize="900000"
                                 maxClockSkew="00:05:00"
                                 maxCookieCachingTime="Infinite"
                                 replayWindow="00:05:00"
                                 sessionKeyRenewalInterval="10:00:00"
                                 sessionKeyRolloverInterval="00:05:00"
                                 reconnectTransportOnFailure="true"
                                 timestampValidityDuration="00:05:00"
                                 cookieRenewalThresholdPercentage="60" />
            <localServiceSettings detectReplays="true"
                                  issuedCookieLifetime="10:00:00"
                                  maxStatefulNegotiations="128"
                                  replayCacheSize="900000"
                                  maxClockSkew="00:05:00"
                                  negotiationTimeout="00:01:00"
                                  replayWindow="00:05:00"
                                  inactivityTimeout="00:02:00"
                                  sessionKeyRenewalInterval="15:00:00"
                                  sessionKeyRolloverInterval="00:05:00"
                                  reconnectTransportOnFailure="true"
                                  maxPendingSessions="128"
                                  maxCachedCookies="1000"
                                  timestampValidityDuration="00:05:00" />
            <secureConversationBootstrap />
          </security>
          <binaryMessageEncoding maxReadPoolSize="64"
                                 maxWritePoolSize="16"
                                 maxSessionSize="2048">
            <readerQuotas maxDepth="32"
                          maxStringContentLength="8192"
                          maxArrayLength="16384"
                          maxBytesPerRead="4096"
                          maxNameTableCharCount="16384" />
          </binaryMessageEncoding>
          <httpTransport manualAddressing="false"
                         maxBufferPoolSize="524288"
                         maxReceivedMessageSize="65536"
                         allowCookies="false"
                         authenticationScheme="Anonymous"
                         bypassProxyOnLocal="false"
                         decompressionEnabled="true"
                         hostNameComparisonMode="StrongWildcard"
                         keepAliveEnabled="true"
                         maxBufferSize="65536"
                         proxyAuthenticationScheme="Anonymous"
                         realm=""
                         transferMode="Buffered"
                         unsafeConnectionNtlmAuthentication="false"
                         useDefaultWebProxy="true" />
        </binding>
        <binding name="AsymmetricCookieHttpsBinding">
          <security authenticationMode="IssuedTokenOverTransport"
                    defaultAlgorithmSuite="Basic256Sha256"
                    messageSecurityVersion="WSSecurity11WSTrust13WSSecureConversation13WSSecurityPolicy12"/>
          <binaryMessageEncoding>
            <readerQuotas maxStringContentLength="1048576"
                          maxArrayLength="2097152"/>
          </binaryMessageEncoding>
          <httpsTransport maxReceivedMessageSize="2162688"
                          authenticationScheme="Anonymous"
                          useDefaultWebProxy="false"/>
        </binding>
      </customBinding>
      <ws2007FederationHttpBinding>
        <binding name="Customers_ws2007FedHttpBinding">
          <security mode="TransportWithMessageCredential">
            <message issuedKeyType="AsymmetricKey">
              <!-- UPDATE: the URL for the SharePoint security service -->
              <issuer address="http://ericwhit210/_vti_bin/sts/spsecuritytokenservice.svc/windows"
                      binding="customBinding"
                      bindingConfiguration="AsymmetricWindowsHttpBinding"/>
              <!-- UPDATE: the metadata URL for the SharePoint security service -->
              <issuerMetadata address="http://ericwhit210/_vti_bin/sts/spsecuritytokenservice.svc?wsdl"/>
            </message>
          </security>
        </binding>
      </ws2007FederationHttpBinding>
    </bindings>
    <extensions>
      <behaviorExtensions>
        <add name="federatedServiceHostConfiguration"
             type="Microsoft.IdentityModel.Configuration.ConfigureServiceHostBehaviorExtensionElement, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
      </behaviorExtensions>
    </extensions>
  </system.serviceModel>
  <microsoft.identityModel>
    <service name="CustomersService.Customers">
      <certificateValidation certificateValidationMode="None"/>
      <audienceUris mode="Never"/>
      <issuerNameRegistry type="Microsoft.IdentityModel.Tokens.ConfigurationBasedIssuerNameRegistry, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
        <trustedIssuers>
          <!-- UPDATE: the thumbprint that was issued by SharePoint Security Token Service -->
          <!-- UPDATE: the name of the issuer token -->
          <add thumbprint="ddbe98f4c2dbe6d78cec14d0d00ab890d15308f6"
               name="ericwhit210 "/>
        </trustedIssuers>
      </issuerNameRegistry>
    </service>
  </microsoft.identityModel>
</configuration>

Conclusion

Dans cet troisième article de la série, nous avons configuré le service Web afin qu'il approuve le Security Token Service de SharePoint et nous avons configuré le STS de SharePoint afin qu'il approuve le service Web. Dans l'article suivant, vous utiliserez SharePoint Designer 2010 pour consommer le service Web en tant que type de contenu externe.

Remerciements

Je tiens ici à remercier Eric White de m'avoir autorisé à traduire son article.
Je remercie xyz pour sa relecture technique et ses propositions.
Je remercie également abc pour sa relecture orthographique et ses propositions.