Domanda

Ho un servizio WCF molto semplice che vorrei esporre pubblicamente. Ho creato il servizio e impostato sul nostro server senza troppi problemi. Il problema è che siamo in grado di utilizzare il servizio dalla nostra rete privata, ma quando proviamo a usarlo dall'esterno della rete, viene generato il seguente errore:

  

Negoziazione SSPI (Security Support Provider Interface) non riuscita.

Ho fatto una piccola ricerca e sembra che WCF utilizzi l'autenticazione di Windows per impostazione predefinita. Vorrei cambiarlo per non utilizzare alcuna autenticazione, ma non sono del tutto sicuro di come. Ecco come appare ora la mia configurazione.

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

Gradirei alcuni puntatori o gomiti nella giusta direzione.

È stato utile?

Soluzione

Bene, il tuo servizio utilizza wsHttpBinding, che per impostazione predefinita richiederà le credenziali utente di Windows, che ovviamente non avranno i tuoi utenti esterni. Non è WCF in sé che utilizza le credenziali di Windows per impostazione predefinita (come dici tu), ma in realtà questa associazione specifica (wsHttpBinding) - altre potrebbero essere predefinite ad altre impostazioni.

Hai un paio di scelte:

  • configura wsHttpBinding (che è piuttosto " heavyweight ") per non usare alcuna sicurezza o per usare la sicurezza nome utente / password che i chiamanti dovrebbero fornire
  • usa basicHttpBinding invece senza sicurezza (questo è il modello ASMX, in sostanza)

Per disattivare completamente la sicurezza da wsHttpBinding, includilo nella tua configurazione:

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

e quindi configurare gli endpoint per utilizzare quella configurazione di associazione:

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

Puoi fare lo stesso con <basicHttpBinding> invece di <wsHttpBinding> se lo desideri (non c'è alcun vantaggio nell'uso di wsHttpBinding rispetto a basicHttpBinding, se hai disattivato la sicurezza e tutte le altre funzionalità più avanzate offerte da wsHttpBinding).

C'è anche un ottimo serie di post di blog che parlano delle basi della sicurezza WCF in termini di cinque diversi scenari tipici - ottima lettura!

Marc

Altri suggerimenti

Questo ti dà sicurezza a livello di trasporto senza autenticazione:

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

Per altri scenari darei un'occhiata al esempi Microsoft WCF .

WCF può essere una vera seccatura quando si tratta di configurarlo. Dai un'occhiata a WCFSecurity fornisce buoni esempi di funzionamento per diversi ambienti di configurazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top