web-dev-qa-db-fra.com

Liaison WCF à HTTPS

Je comprends qu’il existe de nombreux articles à ce sujet, et j’ai parcouru tous ceux qui sont apparus lors de ma recherche et qui ont mis en œuvre tout ce qui a été mentionné. J'ai un service Web WCF qui fonctionne sur mon système local sous HTTP et qui fonctionne sur le serveur sous HTTP. Mais le client exige que cela fonctionne via HTTPS. Le miriad de publications sur ce site et sur d’autres sites m’indique que ce n’est pas aussi simple qu’il devrait être, puisqu’avant, le service Web ASMX "fonctionnait" et n’avait pas besoin d’une configuration compliquée. 

Je reçois l'erreur suivante avec ma configuration actuelle:

Impossible de trouver une adresse de base correspondant au schéma https pour le noeud final Avec la liaison WSHttpBinding. Les schémas d'adresses de base enregistrés Sont [http].

Voici mon code à partir de ce moment, après avoir essayé pendant des jours de le configurer pour qu'il fonctionne sans aucun résultat:

<system.serviceModel>

    <!--     -->
    <serviceHostingEnvironment  aspNetCompatibilityEnabled="true" >
        <baseAddressPrefixFilters>
            <add prefix="https://mysite.com"/>
            <add prefix="http://mysite.com"/>
        </baseAddressPrefixFilters>
    </serviceHostingEnvironment>

    <!-- Set up Custom Behaviors -->    
    <behaviors>

        <endpointBehaviors>
        </endpointBehaviors>

        <serviceBehaviors>
            <behavior name="WebPostService.WebPostServiceBehavior">
                <serviceMetadata httpsGetEnabled="true" httpsGetUrl="WebPostServices.svc/mex"  /> 
                <serviceDebug includeExceptionDetailInFaults="false" />
            </behavior>
        </serviceBehaviors>

    </behaviors>

    <!-- Set up the binding configuration  -->
    <bindings>

        <wsHttpBinding>
            <binding    name="SOAPBinding" 
            >

                <security mode="Transport">
                </security>
            </binding>
        </wsHttpBinding>

    </bindings>

    <services>

        <service    
                    behaviorConfiguration="WebPostService.WebPostServiceBehavior"
                    name="WebPostService.WebPostService"
        >

    <Host>
      <baseAddresses>
        <add baseAddress="https://mysite.com/Services/WebPostService.svc"/>
      </baseAddresses>
    </Host>
            <endpoint   address="" 
                        binding="wsHttpBinding" 
                        bindingConfiguration="SOAPBinding"
                        contract="WebPostService.IWebPostService"
            >
                <identity>
                    <dns value="mysite.com" />
                </identity>
            </endpoint>

            <endpoint   
                        address="mex" 
                        binding="mexHttpsBinding" 
                        contract="IMetadataExchange" 
            >
            </endpoint>

        </service>

    </services>

</system.serviceModel>

Qu'est-ce que je fais de travers et comment puis-je le faire fonctionner avec HTTPS? Je suis frustré que cela ne soit pas aussi simple qu'il le devrait. J'ai été enterré dans la documentation WCF chez MSDN pendant plusieurs mois, et j'ai une bonne connaissance des services, des paramètres et des corrélations - assez pour me frustrer encore plus que si je n'avais aucune connaissance du tout. 

MISE À JOUR: J'y travaillais toujours, j'ai eu une erreur étrange lorsque j'ai essayé de mettre l'URL complète pour l'adresse mex. J'ai changé pour ceci:

address="https://prcwebs.com/Services/WebPostService.svc/mex" 

et j'ai eu l'erreur:

Les paramètres de sécurité de ce service requièrent une authentification Windows, mais N'est pas activé pour l'application IIS qui héberge ce service.

Je n'essaie pas d'utiliser l'authentification Windows, le paramètre de sécurité n'a pas été modifié et est toujours défini sur 

<mode de sécurité = "Transport" />

Impossible de trouver une adresse de base correspondant au schéma https du système d'extrémité avec la liaison WebHttpBinding. Les schémas d’adresses de base enregistrés sont [http] - n’est pas utile, rien n’a été mentionné qui aiderait Impossible de trouver une adresse de base correspondant au schéma http pour le noeud final avec la liaison WSHttpBinding - J'utilise la sécurité des transports, cela ne s'applique pas. essayé de passer à différents modes de sécurité, ne pouvait toujours pas faire fonctionner le site. 

16
stephenbayer

Ajoutez multipleSiteBindingsEnabled="true" à la serviceHostingEnvironment et mettez à jour la sécurité pour désactiver les informations d'identification du client:

<security mode="Transport">
    <transport clientCredentialType="None"></transport>
</security>

EDIT Ma version de travail finale sous Windows 2003 était avec la config suivante.

<system.serviceModel>
    <serviceHostingEnvironment  aspNetCompatibilityEnabled="false" />

    <!-- Set up Custom Behaviors -->    
    <behaviors>
        <endpointBehaviors>
        </endpointBehaviors>
        <serviceBehaviors>
            <behavior name="WebPostService.WebPostServiceBehavior">
                <serviceMetadata httpsGetEnabled="true" httpsGetUrl="WebPostServices.svc/mex"  /> 
                <serviceDebug includeExceptionDetailInFaults="false" />
            </behavior>
        </serviceBehaviors>
    </behaviors>

    <!-- Set up the binding configuration  -->
    <bindings>
        <wsHttpBinding>
            <binding name="SOAPBinding">
                <security mode="Transport">
                  <transport clientCredentialType="None"/>
                </security>
            </binding>
        </wsHttpBinding>
    </bindings>

    <services>
        <service behaviorConfiguration="WebPostService.WebPostServiceBehavior"
                 name="WcfService2.Service1">

            <Host>
                <baseAddresses>
                    <add baseAddress="https://localhost/Service/Service1.svc"/>
                </baseAddresses>
            </Host>
            <endpoint address="" 
                      binding="wsHttpBinding" 
                      bindingConfiguration="SOAPBinding"
                      contract="WcfService2.IService1">
                <identity>
                    <dns value="localhost" />
                </identity>
            </endpoint>

            <endpoint address="mex" 
                      binding="mexHttpsBinding" 
                      contract="IMetadataExchange">
            </endpoint>
        </service>
    </services>
</system.serviceModel>

Vous pouvez accéder au site Web avec https, je suppose donc que la partie certificat de l'installation est correcte. Si vous avez quelque chose que vous voulez comparer avec ma configuration, faites le moi savoir.

3
Luuk

Vous utilisez les mauvaises liaisons pour HTTPS.

Il existe deux classes de liaison distinctes. wsHttpBinding et wsHttpsBinding remarquent le nom de domaine Vous devez ajouter un wsHttpsBinding pour HTTPS sous des liaisons et vous avez besoin d'un nouveau point de terminaison pour cette liaison.

De plus, l'erreur spécifique que vous voyez est généralement visible si IIS n'a pas été configuré pour https à partir de cet emplacement.

  • Ouvrir IIS Manager
  • Sites ouverts
  • Cliquez avec le bouton droit sur Site Web par défaut.
  • Modifier les liaisons
  • Assurez-vous qu'il existe une entrée pour https et http.

  • Ouvrir IIS Manager
  • Trouvez votre application (je pense que ce sera le site Web par défaut).
  • Clic-droit
  • Gérer le site Web/l'application
  • Réglages avancés
  • Protocoles activés
  • http, https
3
Aron

Je l'ai utilisé et cela a fonctionné pour moi, peut-être que cela peut vous aider

Pour activer les liaisons Https sur WCF WsHttp, certaines étapes simples doivent être modifiées dans le fichier web.config.

Ces étapes sont les suivantes:

Activer la sécurité du niveau de transport dans le fichier web.config du service:

Dans cette étape, vous devez changer le mode de sécurité de aucun en transport. Le code ci-dessous montre comment vous pouvez le faire:

<bindings>
    <wsHttpBinding>
        <binding name="TransportSecurity">
            <security mode="Transport">
                <transport clientCredentialType="None"/>
            </security>
        </binding>
    </wsHttpBinding>
</bindings>

Liez la liaison et spécifiez la configuration HTTPS

Vous devez maintenant associer les liaisons, l'étape d'aperçu, aux points de fin. utilisez la balise bindingConfiguration pour spécifier le nom de la liaison. Vous devez également spécifier l'adresse où le service est hébergé. Le code ci-dessous montre comment vous pouvez le faire

<service name="WCFWSHttps.Service1" behaviorConfiguration="WCFWSHttps.Service1Behavior">
<!-- Service Endpoints -->
    <endpoint address=https://localhost/WCFWSHttps/Service1.svc binding="wsHttpBinding"  bindingConfiguration="TransportSecurity" contract="WCFWSHttps.IService1"/>
    <endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange"/>
</service>

. vous devez également modifier httpGetEnabled en httpsGetEnabled dans le serviceMetaData. Le code ci-dessous montre comment vous pouvez le faire:

<serviceMetadata httpsGetEnabled="true"/> 

J'espère que ça a aidé

2
Youssef

J'ai utilisé votre configuration exacte en paramètre 3.5 et cela fonctionne avec le mode Transport en utilisant clientCredentialType="None" comme mentionné ci-dessous dans la réponse de Luuk. Mais pour être sûr, j’ai créé un exemple de projet afin de simuler autant de votre environnement que je pouvais en tirer à partir des informations ici.

Pour simuler votre environnement, j'ai configuré mon IIS (7.5) pour utiliser le pool d'applications Asp.Net 2.0 Integrated standard. J'ai ajouté 3 liaisons http et 3 liaisons https afin de simuler votre "ne peut avoir qu'une seule adresse par problème" et baseAddressPrefixFilters fonctionne avec cela.

J'ai seulement fait une recherche et remplacer sur mysite.com à localhost. Ci-dessous, le copier-coller de la configuration exacte que j'ai utilisée pour produire la capture d'écran:

web.config

<?xml version="1.0"?>
<configuration>
  <system.web>
    <compilation debug="true" />
    <authentication mode="None"/>
    <customErrors mode="Off"/>
  </system.web>
  <system.serviceModel>
    <!--     -->
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true">
      <baseAddressPrefixFilters>
        <add prefix="https://localhost"/>
        <add prefix="http://localhost"/>
      </baseAddressPrefixFilters>
    </serviceHostingEnvironment>
    <!-- Set up Custom Behaviors -->
    <behaviors>
      <endpointBehaviors/>
      <serviceBehaviors>
        <behavior name="WebPostService.WebPostServiceBehavior">
          <serviceMetadata httpsGetEnabled="true" httpsGetUrl="WebPostServices.svc/mex"/>
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <!-- Set up the binding configuration  -->
    <bindings>
      <wsHttpBinding>
        <binding name="SOAPBinding">
          <security mode="Transport">
            <transport clientCredentialType="None"/>
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
    <services>
      <service behaviorConfiguration="WebPostService.WebPostServiceBehavior" name="WebPostService.WebPostService">
        <Host>
          <baseAddresses>
            <add baseAddress="https://localhost/Services/WebPostService.svc"/>
          </baseAddresses>
        </Host>
        <endpoint address="" binding="wsHttpBinding" bindingConfiguration="SOAPBinding" contract="WebPostService.IWebPostService">
          <identity>
            <dns value="localhost"/>
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange"/>
      </service>
    </services>
  </system.serviceModel>
</configuration>

Voici le résultat:

Screenshot

Vous remarquerez que WebPostService.svc apparaît deux fois dans mex URL complète. Vous devez supprimer httpsGetUrl pour n'être que mex au lieu de WebPostService.svc/mex (ou le supprimer complètement, et cela fonctionne toujours de mon côté)

Si vous souhaitez discuter de ceci ou de ce qui pourrait être différent entre nos envinronments en plus de la version IIS, je suis dans le forum de discussion WPF presque toute la journée (encore 5 à 6 heures).

0
Maverik