Tutorial sulla sicurezza dei servizi Web (WS) con esempio SOAP

Cos'è la sicurezza WS?

WS Security è uno standard che affronta la sicurezza quando i dati vengono scambiati come parte di un servizio Web. Questa è una funzionalità chiave di SOAP che lo rende molto popolare per la creazione di servizi Web.

La sicurezza è una caratteristica importante in qualsiasi applicazione web. Poiché quasi tutte le applicazioni web sono esposte a Internet, esiste sempre la possibilità che si verifichi una minaccia alla sicurezza delle applicazioni web. Pertanto, quando si sviluppano applicazioni basate sul Web, è sempre consigliabile garantire che l'applicazione sia progettata e sviluppata tenendo presente la sicurezza.

Minacce alla sicurezza e contromisure

Per comprendere le minacce alla sicurezza che possono essere ostili a un'applicazione Web, esaminiamo un semplice scenario di un'applicazione Web e vediamo come funziona in termini di sicurezza.

Una delle misure di sicurezza disponibili per HTTP è il protocollo HTTPS. HTTPS è il modo sicuro di comunicazione tra il client e il server sul web. HTTPS utilizza il livello Secure Sockets o SSL per comunicazioni sicure. Sia il client che il server avranno un certificato digitale per identificarsi come autentici quando avviene qualsiasi comunicazione tra il client e il server.

Minacce alla sicurezza e contromisure

In una comunicazione HTTPS standard tra il client e il server, si verificano i seguenti passaggi

  1. Il client invia una richiesta al server tramite il certificato client. Quando il server vede il certificato client, lo prende nota nel suo sistema di cache in modo che sappia che la risposta dovrebbe tornare solo a questo client.
  2. Il server quindi si autentica presso il client inviando il proprio certificato. Ciò garantisce che il client comunichi con il server giusto.
  3. Tutte le comunicazioni successive tra il client e il server vengono crittografate. Ciò garantisce che se altri utenti tentassero di violare la sicurezza e ottenere i dati richiesti, non sarebbero in grado di leggerli perché sarebbero crittografati.

Ma il tipo di sicurezza sopra descritto non funzionerà in tutte le situazioni. Può arrivare un momento in cui il client può parlare con più server. L'esempio riportato di seguito mostra un client che comunica contemporaneamente sia con un database che con un server Web. In questi casi non tutte le informazioni possono passare attraverso il protocollo https.

Minacce alla sicurezza e contromisure

È qui che SOAP entra in azione per superare tali ostacoli adottando le specifiche WS Security. Con questa specifica, tutti i dati relativi alla sicurezza sono definiti nell'elemento di intestazione SOAP.

L'elemento header può contenere le informazioni indicate di seguito

  1. Se il messaggio all'interno del corpo SOAP è stato firmato con una chiave di sicurezza, tale chiave può essere definita nell'elemento header.
  2. Se qualsiasi elemento all'interno del corpo SOAP viene crittografato, l'intestazione conterrebbe le chiavi di crittografia necessarie in modo che il messaggio possa essere decrittografato quando raggiunge la destinazione.

In ambienti con più server, la tecnica di autenticazione SOAP sopra descritta risulta utile nel modo seguente.

  • Poiché il corpo SOAP è crittografato, potrà essere decrittografato solo dal server Web che ospita il servizio Web. Ciò è dovuto al modo in cui è progettato il protocollo SOAP.
  • Supponiamo che se il messaggio viene passato al server del database in una richiesta HTTP, non può essere decrittografato perché il database non dispone dei meccanismi adeguati per farlo.
  • Solo quando la richiesta raggiunge effettivamente il server Web come protocollo SOAP, sarà in grado di decifrare il messaggio e inviare la risposta appropriata al client.

Vedremo nei successivi argomenti come può essere utilizzato lo standard WS Security SOAP.

Standard di sicurezza dei servizi Web

Come discusso nella sezione precedente, lo standard WS-Security ruota attorno all'inclusione della definizione di sicurezza nell'intestazione SOAP.

Le credenziali nell'intestazione SOAP sono gestite in 2 modi.

Innanzitutto, definisce un elemento speciale chiamato UsernameToken. Viene utilizzato per passare il nome utente e la password al servizio web.

L'altro modo è utilizzare un token binario tramite BinarySecurityToken. Viene utilizzato in situazioni in cui vengono utilizzate tecniche di crittografia come Kerberos o X.509.

Il diagramma seguente mostra il flusso del funzionamento del modello di sicurezza in WS Security

Standard di sicurezza dei servizi Web

Di seguito sono riportati i passaggi che si svolgono nel flusso di lavoro sopra

  1. È possibile inviare una richiesta dal client del servizio Web al servizio token di sicurezza. Questo servizio può essere un servizio Web intermedio creato appositamente per fornire nomi utente/password o certificati all'effettivo servizio Web SOAP.
  2. Il token di sicurezza viene quindi passato al client del servizio Web.
  3. Il client del servizio Web ha quindi chiamato il servizio Web, ma, questa volta, assicurandosi che il token di sicurezza sia incorporato nel messaggio SOAP.
  4. Il servizio Web comprende quindi il messaggio SOAP con il token di autenticazione e può quindi contattare il servizio token di sicurezza per verificare se il token di sicurezza è autentico o meno.

Lo snippet seguente mostra il formato della parte di autenticazione che fa parte del documento WSDL. Ora, in base allo snippet seguente, il messaggio SOAP conterrà 2 elementi aggiuntivi, uno è il nome utente e l'altro è la password.

<xs:element name="UsernameToken">  
	<xs:complexType>       
		<xs:sequence>           
			<xs:element ref="Username"/>         
			<xs:element ref="Password" minOccurs="0"/>        
		</xs:sequence>       
	<xs:attribute name="Id" type="xs:ID"/>    
</xs:complexType></xs:element>

Quando il messaggio SOAP viene effettivamente passato tra i client e il server, la parte del messaggio che contiene le credenziali dell'utente potrebbe assomigliare a quella mostrata sopra. Il nome dell'elemento wsse è un elemento speciale denominato definito per SOAP e significa che contiene informazioni basate sulla sicurezza.

Come creare servizi web sicuri

Ora diamo un'occhiata all'esempio di sicurezza del servizio Web SOAP. Costruiremo la sicurezza del servizio web sull'esempio dimostrato in precedenza nel capitolo SOAP e vi aggiungeremo un livello di sicurezza.

Nel nostro esempio creeremo un semplice servizio web, che verrà utilizzato per restituire una stringa all'applicazione che chiama il servizio web. Ma questa volta, quando viene richiamato il servizio web, è necessario fornire le credenziali al servizio chiamante. Seguiamo i passaggi seguenti per creare il nostro servizio Web SOAP e aggiungervi la definizione di sicurezza.

Passo 1) Il primo passo è creare un file vuoto Asp.Net Applicazione Web. Da Visual Studio 2013, fare clic sull'opzione di menu File->Nuovo progetto.

Crea servizi Web sicuri

Una volta cliccato sull'opzione Nuovo progetto, Visual Studio ti darà un'altra finestra di dialogo per scegliere il tipo di progetto e per fornire i dettagli necessari del progetto. Questo è spiegato nel passaggio successivo

Passo 2) In questa fase,

  1. Assicurati di scegliere prima il C# modello web per applicazione Web ASP.NET. Il progetto deve essere di questo tipo per creare un progetto di servizi web. Scegliendo questa opzione, Visual Studio eseguirà i passaggi necessari per aggiungere i file richiesti da qualsiasi applicazione basata sul web.
  2. Dai un nome al tuo progetto che nel nostro caso è stato dato come "webservice.asmx." Quindi assicurati di fornire una posizione in cui verranno archiviati i file di progetto.

Crea servizi Web sicuri

Una volta fatto, vedrai il file di progetto creato nel tuo Solution Explorer in Visual Studio 2013.

Crea servizi Web sicuri

Passo 3) In questa fase,

Aggiungeremo un file di servizio Web al nostro progetto

  1. Innanzitutto fare clic con il pulsante destro del mouse sul file di progetto come mostrato di seguito

Crea servizi Web sicuri

  1. Dopo aver fatto clic con il pulsante destro del mouse sul file di progetto, hai la possibilità di scegliere l'opzione "Aggiungi->Servizio Web (ASMX) per aggiungere un file di servizio Web. Basta fornire un nome di Servizio Tutorial per il file del nome del servizio web.

    Crea servizi Web sicuri

Il passaggio precedente aprirà una finestra di dialogo, in cui è possibile immettere il nome del file del servizio Web. Quindi, nella finestra di dialogo sottostante, immettere il nome di TutorialService come nome del file.

Crea servizi Web sicuri

Passo 4) Aggiungi il seguente codice al tuo file asmx del Tutorial Service. Il frammento di codice seguente viene utilizzato per aggiungere una classe personalizzata che verrà utilizzata per modificare l'intestazione SOAP quando viene generato il messaggio SOAP. Poiché ora vogliamo aggiungere credenziali di sicurezza all'intestazione SOAP, questo passaggio è obbligatorio.

Crea servizi Web sicuri

		return "This is a Guru99 Web Service";
	}
	
	public class AuthHeader : SoapHeader
	{
		public string UserName;
		public string Password;

	}
}

Spiegazione del codice: -

  1. Stiamo ora creando una classe separata chiamata AuthHeader che è di tipo Classe SoapHeader. Ogni volta che si desidera modificare ciò che viene passato nell'intestazione SOAP, è necessario creare una classe che utilizzi la classe SoapHeader incorporata di .Net. Personalizzando l'intestazione SOAP, ora abbiamo la possibilità di passare un "Nome utente" e una "Password" quando viene chiamato il servizio web.
  2. Definiamo quindi le variabili "Nome Utente" e "Password" che sono di tipo stringa. Verranno utilizzati per contenere i valori del nome utente e della password che vengono passati al servizio web.

Passo 5) Come passaggio successivo, è necessario aggiungere il seguente codice allo stesso File TutorialService.asmx. Questo codice definisce effettivamente la funzione del nostro servizio web. Questa funzione restituisce una stringa "Questo è un servizio Web Guru99" al client. Ma questa volta la stringa verrà restituita solo se l'applicazione client passa le credenziali al servizio web.

Crea servizi Web sicuri

public class TutorialService : System.Web.Services.WebService
{ 
	public AuthHeader Credentials; 
	
	[SoapHeader("Credentials")] 
	
	[WebMethod]
	public string Guru99WebService()
	{ 
	
		if (Credentials.UserName.ToLower() != "Guru99" ||
		Credentials.Password.ToLower() != "Guru99Password") 
		{
			throw new SoapException("Unauthorized",
			SoapException.ClientFaultCode);
		}
		eise
		return "This is a Guru99 Web service";
	}

Spiegazione del codice: -

  1. Qui stiamo creando un oggetto della classe AuthHeader creata nel passaggio precedente. Questo oggetto verrà passato al ns Guru99Webservice in cui il nome utente e la password possono essere esaminati attentamente.
  2. L'attributo [SoapHeader] viene ora utilizzato per specificare che quando viene chiamato il servizio Web, è necessario che vengano passati il ​​nome utente e la password.
  3. In questo blocco di codice stiamo effettivamente esaminando il nome utente e la password passati quando viene richiamato il servizio web. Se il nome utente è uguale a "Guru99" e la password è uguale a "Guru99Password", al client viene passato il messaggio "Questo è un servizio Web Guru99". Altrimenti verrà inviato un errore al client se vengono passati l'ID utente e la password errati.

Se il codice viene eseguito correttamente, quando si esegue il codice nel browser verrà visualizzato il seguente output.

Produzione:

Crea servizi Web sicuri

L'output precedente viene visualizzato quando il programma viene eseguito, il che significa che il servizio Web è ora disponibile. Facciamo clic sul Servizio Descriptcollegamento ionico.

Crea servizi Web sicuri

Dalla descrizione del servizio potrai ora vedere che il nome utente e la password sono elementi del servizio wsdl file. Questi parametri devono essere inviati quando viene richiamato il servizio web.

Le migliori pratiche per la sicurezza dei servizi Web

Di seguito sono riportate le considerazioni sulla sicurezza che dovrebbero essere prese in considerazione quando si lavora con i servizi Web

1. Controllo e gestione dei registri – Utilizzare la registrazione dell'applicazione per registrare tutte le richieste che arrivano ai servizi web. Ciò fornisce un rapporto dettagliato su chi ha invocato il servizio web e può aiutare nell'analisi dell'impatto in caso di violazione della sicurezza.

2. Flusso delle chiamate al servizio web – Provare ad annotare il flusso delle chiamate nei servizi web. Per impostazione predefinita, un'applicazione può chiamare più richieste di servizi Web con token di autenticazione passati tra questi servizi Web. Tutte le chiamate tra servizi web devono essere monitorate e registrate.

3. Informazioni sensibili – Non includere informazioni sensibili nelle voci di registro come password o numeri di carta di credito o qualsiasi altro tipo di informazione riservata. Se è presente un evento che contiene queste informazioni, è necessario eliminarlo prima della registrazione.

4. Tieni traccia degli affari Operazioni – Tieni traccia delle operazioni aziendali significative. Ad esempio, strumenti la tua applicazione per registrare l'accesso a metodi e logiche aziendali particolarmente sensibili. Facciamo un esempio di un'applicazione per lo shopping online. Ci sono più passaggi in una tipica applicazione come la scelta degli articoli da acquistare, gli articoli caricati nel carrello e quindi l'acquisto finale. L'intero flusso di lavoro aziendale deve essere monitorato dal servizio web.

5. Autenticazione corretta – L'autenticazione è il meccanismo mediante il quale i client possono stabilire la propria identità con il servizio web utilizzando un determinato insieme di credenziali che possono dimostrare tale identità. Non si dovrebbero mai memorizzare le credenziali dell'utente e, pertanto, se si utilizza WS Security per chiamare il servizio Web, è necessario notare che il servizio Web non deve memorizzare le credenziali inviate nell'intestazione SOAP. Questi dovrebbero essere eliminati dal servizio web.

Sommario

  • SOAP fornisce un livello aggiuntivo denominato WS Security per fornire ulteriore sicurezza quando vengono effettuate chiamate ai servizi Web.
  • La sicurezza WS può essere richiamata con un semplice nome utente o password oppure può essere utilizzata con certificati binari per l'autenticazione
  • Lo abbiamo visto . Net possiamo personalizzare il servizio Web in modo che un nome utente e una password vengano passati come parte dell'elemento di intestazione SOAP.