2009-07-07 9 views
9

Ho un servizio Web con un sacco di metodi che mi piacerebbe un po 'sicuro. I dati non sono poi così confidenziali, ma mi piacerebbe comunque che limiti l'accesso solo a coloro che utilizzano un determinato ID utente e password memorizzati nel file web.config dei servizi Web. Un client di servizio Windows C# chiamerà questo servizio Web una volta al giorno o alla settimana.servizio web asmx: autenticazione client

Qualcuno può pubblicare un semplice esempio di come posso farlo? Grazie in anticipo.

risposta

3

ci sono tre approcci generali per la sicurezza ad hoc SOAP:

  1. Il primo è quello di passare le informazioni di autenticazione con ogni chiamata.
  2. Il secondo è quello di passarlo una volta per ricevere un ID di sessione che viene poi passato con ogni chiamata.
  3. Il terzo è essenzialmente uguale al secondo, utilizzando solo i cookie.

Dei tre, vi consiglio il primo metodo, che non richiede il server per mantenere lo stato, ma può essere altrettanto veloce a causa di caching.

+0

Per ID di sessione, si fa riferimento alla sicurezza basata su token? Questo è quello che in genere sento nominare. Anche questo "primo metodo" può essere molto diverso e completamente inefficace a seconda di come lo imposta. Cioè Autenticazione di base senza HTTPS che non ha alcun valore poiché il login e la password sono inviati in testo normale. –

+0

Un po ', anche se può essere semplice come un GUID. Ciò che importa è che è grande ed efficacemente casuale, quindi non può essere complicato. Non è necessario inviare nulla nemmeno in testo normale.Ad esempio, è possibile chiamare GetChallenge per ricevere un GUID, quindi chiamare LoginWithResponse, passare il GUID, insieme al nome dell'account cleartext e all'hash della concatenazione di GUID, account e password. O, naturalmente, potresti usare HTTPS, che lo risolve da un'altra direzione. –

9

Questo è abbastanza simile alla mia domanda: "What should we implement to authorize clients to use our web service?"

abbiamo finito per non pubblicare il WSDL e solo servendo il servizio via https e che richiedono basic authentication. NON utilizzare l'autenticazione di base se non è possibile forzare tutti i client a utilizzare https.

Se questo è un servizio Web .net, ecco la voce del file di configurazione per impedire la pubblicazione di wsdl.

<system.web> 
    <webServices> 
     <protocols> 
     <remove name="Documentation" /> 
     </protocols> 
    </webServices> 
    </system.web> 

Quando si goto pagina, riceverai un messaggio di errore simile al messaggio che si otterrebbe se si è tentato di tirare manualmente giù un web.config da un sito. Come sottolinea Steven, questa è sicurezza attraverso l'oscurità e NON deve essere usato da solo per proteggere il tuo servizio web. Tuttavia, se utilizzato in aggiunta a auth + https di base, è un piccolo extra in più.

client codice lato:

Per accedere a questo servizio Web da un client, aggiungere il riferimento Web il modo normale e nel codice chiamante (supponendo che si chiama il vostro riferimento web WebRef).

WebRef.Url = "url"; 
WebRef.Credentials = new System.Net.NetworkCredential("userid", "password"); 

Inoltre, è possibile esaminare WebRef.PreAuthenticate per salvare alcuni viaggi di andata e ritorno. Tieni semplicemente presente che ti divertirai a provarlo se sei dietro un proxy aziendale. I proxy vengono utilizzati tramite il WebRef da

WebRef.Proxy = new WebProxy("url"); 
WebRef.Proxy.Credentials = new System.Net.NetworkCredential("userid", "password"); 
+0

Questo non è un passaggio aggiuntivo irragionevole, ma è la sicurezza attraverso l'oscurità, dal momento che nulla su https autentica il client, quindi l'intera cosa va in pezzi nel momento in cui l'URL del server viene scoperto (e lo sarà). Detto questo, richiedere https e utilizzare l'autenticazione di base è ragionevole. –

+2

Assolutamente, non pubblicare il WSDL è sicurezza attraverso l'oscurità. Tuttavia, l'autenticazione di base + https + un po 'di sicurezza incorporata nel codice del servizio Web di per sé non è la sicurezza attraverso l'oscurità. Se l'URL viene scoperto, non avrà il WSDL che è ciò che si desiderava. –

+0

Non ho accesso al server in cui risiederà il servizio web, quindi non sono sicuro che saranno in grado di configurare solo l'accesso https. C'è qualche altro metodo che puoi consigliare? – zSynopsis