2009-04-30 12 views
19

ho creato un proxy di un Servizio Web con Visual Studio 2008, e ha creato per me la seguente voce nel app.config:Connettiti con WCF per un webservice autenticato con username/password

<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 webservice ha l'autenticazione username/password, quindi ho bisogno di aggiungerlo da qualche parte qui.

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

EDIT:

ho cambiato la sezione sicurezza:

<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 potrebbe essere utilizzando le credenziali, ma è dandomi l'errore:

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

io non so nemmeno se questo è il modo giusto per andare ...

+3

WCF è l'inferno configurazione. Quale auth store vuoi usare? Windows ... appartenenza ASP o personalizzata come un database? E hai guardato attraverso questo: http://msdn.microsoft.com/en-us/library/bb398990.aspx –

+0

Infatti. Si tratta di un servizio Web esterno con un nome utente/password univoco da utilizzare sempre per tutte le mie chiamate. Ed è http. Quindi immagino che potrebbe essere più di un'autorizzazione di un endpoint, se questo ha senso! – antonioh

+0

All'inizio non è possibile specificare il nome utente e la password ovunque nella configurazione (ma solo nel codice) - quindi, di nuovo, si vorrebbe avere la password in un file di configurazione in chiaro? VERAMENTE? –

risposta

34

I post qui la soluzione per 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 di default. L'unica differenza rispetto al codice pubblicato nella domanda è il nodo di sicurezza .

Da notare anche la modalità = opzione "TransportCredentialOnly", questo consente di inviare username/password utilizzando http invece di https. Questo è necessario per testare gli ambienti come quello che sto usando. In seguito, ovviamente, preferirai https per inviare le tue credenziali.

Successivamente nel codice potrai inserire il tuo username/password:

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

Questo ha davvero reso la mia giornata! Grazie mille per la condivisione, questo ha salvato molte persone un sacco di problemi. – cudahead

+0

@antonioh Ottiene 'La richiesta HTTP è stata vietata con lo schema di autenticazione client 'Base'. Con tale approccio; sai cosa potrebbe causare questo? – FMFF

+0

Argh ... chi avrebbe trovato il ... UserName.UserName .... –

5

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

Una volta ottenuto un certificato SSL avete due opzioni su come le credenziali vengono inviate, il trasporto o la sicurezza ed opzioni multiple per il tipo di credenziale. MSDN ha un good guide per tutte le varie opzioni.

+1

Trovato. Ti consente con l'opzione . Ovviamente questo è per un ambiente di test, in seguito dovresti usare https. Cheers – antonioh

1

Ho avuto lo stesso problema e provato la soluzione di cui sopra qualche modo questo non ha funzionato per me ero continuo 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 quindi 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> 
Problemi correlati