Question

Je souhaite exposer publiquement un service WCF très simple. J'ai créé le service et l'ai configuré sur notre serveur sans trop de problèmes. Le problème est que nous pouvons utiliser le service à partir de notre réseau privé, mais lorsque nous essayons de l’utiliser de l’extérieur du réseau, l’erreur suivante est renvoyée:

  

La négociation de l'interface SSPI (Security Support Provider Interface) a échoué.

J'ai fait quelques recherches et il semblerait que WCF utilise l'authentification Windows par défaut. J'aimerais changer pour ne pas utiliser d'authentification, mais je ne sais pas trop comment. Voici à quoi ressemble ma configuration maintenant.

<system.serviceModel>
    <services>
        <service behaviorConfiguration="XX.ZZ.WebService.MyServiceBehavior"
         name="XX.ZZ.WebService.MyService">
            <endpoint  address="" binding="wsHttpBinding" contract="XX.ZZ.WebService.IMyService">
            </endpoint>
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        </service>
    </services>
    <behaviors>
        <serviceBehaviors>
            <behavior name="XX.ZZ.WebService.MyServiceBehavior">
                <serviceMetadata httpGetEnabled="true" />
                <serviceDebug includeExceptionDetailInFaults="true" />
            </behavior>
        </serviceBehaviors>
    </behaviors>
</system.serviceModel>

J'apprécierais des conseils ou des coups de pouce dans la bonne direction.

Était-ce utile?

La solution

Eh bien, votre service utilise wsHttpBinding, qui requiert par défaut les informations d'identification de l'utilisateur Windows, ce que vos utilisateurs externes n'auront évidemment pas. Ce n’est pas WCF en lui-même qui utilise les informations d’identité Windows par défaut (comme vous l’indiquez), mais bien cette liaison particulière (wsHttpBinding) - d’autres peuvent utiliser par défaut d’autres paramètres.

Vous avez plusieurs choix:

  • configurez wsHttpBinding (qui est plutôt " heavy-weight ") pour ne pas utiliser de sécurité du tout ou pour utiliser la sécurité de nom d'utilisateur / mot de passe que les appelants devraient fournir
  • utilisez basicHttpBinding sans sécurité à la place (il s’agit du modèle ASMX)

Pour désactiver complètement la sécurité de wsHttpBinding, incluez-le dans votre configuration:

<bindings>
  <wsHttpBinding>
    <binding name="NoSecurity">
      <security mode="None" />
    </binding>
  </wsHttpBinding>
</bindings>

, puis configurez vos points de terminaison pour utiliser cette configuration de liaison:

<system.serviceModel>
    <services>
        <service name="XX.ZZ.WebService.MyService"
                 behaviorConfiguration="XX.ZZ.WebService.MyServiceBehavior">
           <endpoint address="" 
                     binding="wsHttpBinding" 
                     bindingConfiguration="NoSecurity" 
                     contract="XX.ZZ.WebService.IMyService">
            </endpoint>
            <endpoint address="mex" 
                      binding="mexHttpBinding" 
                      contract="IMetadataExchange" />
        </service>
    </services>

Vous pouvez faire la même chose avec <basicHttpBinding> au lieu de <wsHttpBinding> si vous le souhaitez (l'utilisation de wsHttpBinding par rapport à basicHttpBinding ne présente aucun avantage si vous désactivez la sécurité et toutes les autres fonctionnalités plus avancées proposées par wsHttpBinding).

Il existe également un très bon série de billets de blog qui aborde les principes de base de la sécurité WCF sous la forme de cinq scénarios types différents - excellente lecture!

Marc

Autres conseils

Cela vous donne une sécurité au niveau du transport sans authentification:

<configuration>  <system.serviceModel>
    <services>
      <service 
          name="Microsoft.ServiceModel.Samples.CalculatorService"
          behaviorConfiguration="CalculatorServiceBehavior">
        <endpoint address=""
                  binding="wsHttpBinding"
                  bindingConfiguration="Binding1" 
                  contract="Microsoft.ServiceModel.Samples.ICalculator" />
      </service>
    </services>
    <bindings>
      <wsHttpBinding>
        <binding name="Binding1">
          <security mode="Transport">
            <transport clientCredentialType="None"/>
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
    <behaviors>
      <serviceBehaviors>
        <behavior name="CalculatorServiceBehavior">
          <serviceDebug includeExceptionDetailInFaults="False" />
        </behavior>
      </serviceBehaviors>
    </behaviors>  </system.serviceModel>
</configuration>

Pour d’autres scénarios, je voudrais jeter un coup d’œil sur le Exemples Microsoft WCF .

WCF peut être une vraie galère quand il s’agit de le configurer. WCFSecurity , il fournit de bons exemples de travail pour différents environnements de configuration.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top