Domanda

Ho creato un proxy di un servizio Web con Visual Studio 2008 e ha creato per me la seguente voce in app.config:

<system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="MyNameHandlerSoapBinding" closeTimeout="00:01:00"
                    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                    allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                    maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                    messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
                    useDefaultWebProxy="true">
                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                    <security mode="None">
                        <transport clientCredentialType="None" proxyCredentialType="None"
                            realm="" />
                        <message clientCredentialType="UserName" algorithmSuite="Default" />
                    </security>
                </binding>
            </basicHttpBinding>
        </bindings>
        <client>
          <endpoint address="http://www.***/***/***"
              binding="basicHttpBinding" bindingConfiguration="MyNameHandlerSoapBinding"
              contract="***.MyNameHandler" name="MyName">
          </endpoint>
        </client>
    </system.serviceModel>

Il servizio web è dotato di autenticazione con nome utente / password, quindi devo aggiungerlo da qualche parte qui.

Sono un po 'perso nel mare della documentazione WCF, penso che devo cambiare da basicHttpBinding a wsHttpBinding o customBinding per poter aggiungere gli elementi di autenticazione, ma non lo capisco davvero. Qualcuno potrebbe dare qualche suggerimento rapido o qualsiasi link utile che dice come farlo?

Modifica

Ho modificato la sezione sulla sicurezza in:

<security mode="Transport">
    <transport clientCredentialType="Basic" proxyCredentialType="None"
         realm="" />
</security>

e aggiunto nel codice:

ws.ClientCredentials.UserName.UserName = "";
ws.ClientCredentials.UserName.Password = "";

Ora sembra che stia usando le credenziali ma mi sta dando l'errore:

lo schema URI fornito 'http' non è URI previsto 'https'

Non so nemmeno se questa è la strada giusta da percorrere ...

È stato utile?

Soluzione

Pubblico qui la soluzione per i futuri lettori:

<system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="MyHandlerSoapBinding" closeTimeout="00:01:00"
            openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
            allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
            maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
            messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
            useDefaultWebProxy="true">
          <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
              maxBytesPerRead="4096" maxNameTableCharCount="16384" />
          <security mode="TransportCredentialOnly">
            <transport clientCredentialType="Basic"  />
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>
    <client>
      <endpoint address="http://www.***/***/***/MyHandler"
          binding="basicHttpBinding" bindingConfiguration="MyHandlerSoapBinding"
          contract="***.MyHandler" name="MyHandler">
      </endpoint>

    </client>
  </system.serviceModel>

Alla fine ho potuto usare il basicHttpBinding predefinito. L'unica differenza rispetto al codice pubblicato nella domanda è il nodo di sicurezza .

Nota anche l'opzione mode = " TransportCredentialOnly " , questo ti permette di inviare username / password usando http invece di https . Questo è necessario per testare ambienti come quello che sto usando. In seguito ovviamente preferirai https per inviare le tue credenziali.

Successivamente nel codice inserirai il tuo nome utente / password:

var ws = new ***.MyHandlerClient("MyHandler");
ws.ClientCredentials.UserName.UserName = "myUsername";
ws.ClientCredentials.UserName.Password = "myPassword";
var result = ws.executeMyMethod();

Altri suggerimenti

Il messaggio di errore è giusto. WCF non consentirà il trasporto di nomi utente e password su un protocollo non protetto. Il tuo servizio web deve utilizzare HTTPS (con il certificato SSL operatore)

Una volta che hai un certificato SSL hai due opzioni su come inviare le credenziali, trasporto o sicurezza e più opzioni per il tipo di credenziale. MSDN ha una una buona guida a tutte le varie opzioni.

Ho avuto lo stesso problema e ho provato la soluzione sopra In qualche modo questo non ha funzionato per me Continuavo a ricevere il messaggio " Nessuna intestazione WS-Security trovata "

Dopo un lungo periodo di test e tentativi riesco a farlo funzionare Ho aggiunto il codice dell'intestazione nel client come di seguito e poi funziona!

<client>
    <endpoint address="http://your.service.com" binding="basicHttpBinding" bindingConfiguration="XXXBinding" contract="contract.XXX" name="XXXPort">
        <headers xmlns:wsse="http://your.xsd">
            <wsse:Security mustUnderstand="1">
                <wsse:UsernameToken>
                    <tenant>XXX</tenant>
                    <wsse:Username>XXX</wsse:Username>
                    <wsse:Password Type="http://www.xxxx.com/wss#PasswordText">XXX</wsse:Password>
                </wsse:UsernameToken>
            </wsse:Security>
        </headers>
    </endpoint>
</client>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top