Frage

Ich habe einen sehr einfachen WCF-Dienst, die ich öffentlich aussetzen möchte. Ich habe den Dienst und legen Sie es ohne viel Aufwand über unseren Server auf. Das Problem ist, dass wir in der Lage sind, von den Service zu nutzen innerhalb unseres privaten Netzwerk, aber wenn wir es von außerhalb des Netzwerks zu verwenden versuchen, wird folgende Fehler ist werfen:

  

Die Security Support Provider Interface (SSPI) konnte nicht ausgehandelt werden.

Ich habe eine wenig Forschung und es klingt wie WCF Windows-Authentifizierung verwendet standardmäßig. Ich möchte es ändern keine Authentifizierung zu verwenden, aber ich bin mir nicht ganz sicher, wie. Hier ist, wie mein Config sieht jetzt.

<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>

Ich würde einige Hinweise zu schätzen wissen, oder stupst in der richtigen Richtung.

War es hilfreich?

Lösung

Nun, Ihr Dienst verwendet den wsHttpBinding, die standardmäßig wird Windows-Benutzeranmeldeinformationen erforderlich ist - die externen Benutzer offensichtlich nicht haben. Es ist nicht in sich selbst WCF, die Windows-Anmeldeinformationen standardmäßig verwendet (wie Sie angeben), aber wirklich diese besondere Bindung (wsHttpBinding.) - andere auf andere Einstellungen Standard könnte

Sie haben ein paar Möglichkeiten:

  • konfiguriert wsHttpBinding (die eher „Schwergewicht“) überhaupt keine Sicherheit zu verwenden, oder Benutzername / Passwort-Sicherheit zu verwenden, welche die Anrufer bereitstellen müßten
  • Verwendung Basichttpbinding ohne Sicherheit statt (das ist das ASMX-Modell, im Grunde)

So deaktivieren Sie die Sicherheit vollständig von wsHttpBinding, umfassen diese in Ihrer config:

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

und konfigurieren Sie Ihre Endpunkte, die Bindungskonfiguration verwenden:

<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>

Sie könnten das gleiche mit <basicHttpBinding> statt <wsHttpBinding> tun, wenn Sie wollen (es gibt keinen Nutzen wsHttpBinding vs. Basichttpbinding in Verwendung, wenn Sie die Sicherheit und alle anderen erweiterten Funktionen ausgeschaltet, dass WSHttpBinding Angebote).

Es gibt auch eine wirklich gute Blog-Post-Serie diesem Vortrag über die Grundlagen der WCF Sicherheit in Bezug auf fünf verschiedene, typische Szenarien - ausgezeichnete lesen

Marc

Andere Tipps

Das gibt Ihnen Transport Level Security ohne Authentifizierung:

<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>

Für andere Szenarien hätte ich einen Blick auf die Microsoft WCF Proben .

WCF kann ein echten Schmerzen, wenn es über die Konfiguration kommt. Schauen Sie sich auf WCFSecurity es gute Arbeitsproben für verschiedene Konfigurations Umgebungen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top