Soap01

Da sia.
Versione del 31 ott 2007 alle 12:09 di Malvezzi (discussione | contributi)
(diff) ← Versione meno recente | Versione attuale (diff) | Versione più recente → (diff)
Vai alla navigazione Vai alla ricerca

Web service di autenticazione su LDAP

Warning
Warning
Warning

Esiste una soluzione migliore: Shibboleth.

Shibboleth è più sicuro, più semplice e più flessibile ed inoltre offre il Single Sign On. Non usate questo servizio se non avete ottime ragioni per farlo.


Il server http://soap01.unimore.it è un intermediario per l'autenticazione su LDAP. Gli sviluppatori di applicazioni web che non vogliono occuparsi di chiamate dirette al server LDAP possono delegarle a soap01.unimore.it.

Il meccanismo di interrogazione si differenzia a seconda se i dati di autenticazione dell'utente sono mandati per POST sul server web che contiene l'applicazione o direttamente a soap01.unimore.it.

La prima via, per i server web con https, è più semplice ed elegante: il server web si connette a soap01.unimore.it con il protocollo SOAP e recupera i dati di autenticazione.

Interrogazione diretta del web service SOAP con username e password

Il web service usa SOAP e XML/RPC. Per usare il protocollo SOAP, il file wsdl si trova a:

https://soap01.unimore.it/auth/backend/service.wsdl

Il metodo di autenticazione si chiama "Auth" (case sensitive!) e si aspetta una username e una password.

Risponde con un array di oggetti "VectorInfo" che sono composti da un attributo stringa "key" che contiene il nome del campo LDAP restituito e un attributo array "value" che ne contiene i valori (che possono essere multipli).

Gli errori sono contenuti nel "VectorInfo" "error" che altrimenti non è presente.

Client in ruby

require 'soap/wsdlDriver'

wsdl='https://soap01.unimore.it/auth/backend/service.wsdl'
item_server=SOAP::WSDLDriverFactory.new(wsdl).create_rpc_driver

res = item_server.Auth('username', 'passwd')

res.each do |a|
  puts a.key + " = " + a.value.join(", ")
  end

Client in php

Bisogna installare il supporto soap:

apt-get install php-soap
<?php
$wsdl="https://soap01.unimore.it/auth/backend/service.wsdl";
$client=new SoapClient($wsdl);
$res=$client->Auth("username", "password");

foreach ($res as $v)
{
  echo $v->key." = ".join(", ",$v->value)."\n";
}
?>

(testato solo su php5)

Ridirezione della form

Nel caso il server web non disponga di https o comunque voglia ridirigere il POST della form del client al server soap01, esistono due possibilità di recuperare i dati collegati all'utente che si è autenticato:

  • soap01 fa un redirect sul web server e rende un token grazie al quale il web server ritira i dati utente tramite protocollo SOAP;
  • soap01 fa un redirect al web server e passa in GET i dati utenti cifrati e firmati.

La form del client deve essere ridiretta nel primo caso a: https://soap01.unimore.it/auth/frontend/auth, i campi devono chiamarsi "username" e "password" e deve essere presente un campo hidden "jump_to" con la pagina su cui fare il redirect del browser del client. "jump_to" deve essere il nome dns dell'host (non l'IP).

Nel secondo caso la ridirezione avviene a https://soap01.unimore.it/auth/frontend/auth_crypt oppure https://soap01.unimore.it/auth/frontend/auth_appli, a seconda se si voglia specificare il campo "jump_to" oppure "appli". Il campo "appli" contiene un codice applicazione da cui soap01 ricava la pagina a cui fare la redirezione. Ovviamente ogni nuovo codice "appli" deve essere inserito nell'applicazione (chiedere al redattore di questo articolo).

Restituzione di un token

soap01 restituisce in GET un parametro "unique_id" che permette di recuperare i dati utenti, tramite una chiamata al metodo FindInfoById dello stesso web service citato in precedenza, "backend". Il file wsdl che identifica il servizio SOAP è quindi lo stesso (https://soap01.unimore.it/auth/backend/service.wsdl), il formato dati restituito è identico (un array di VectorInfo).

Restituzione dei dati cifrati

In questo scenario tutti i dati del risultato dell'autenticazione dell'utente sono presentati direttamente come parameri GET in coda all'indirizzo a cui il browser è stato ridiretto, previa semplice codifica Base64. Per evitate manipolazioni, è presente un hash che permette di verificare l'integrità dei dati.

I parametri restituiti sono:

  • query_data: l'esito dell'operazione Encode in Base64
  • digest: lo hash SHA1 di ( query_data prima del Base64 + codice segreto da richiedermi )

In query_data c'è anche una marcatura temporale, che deve essere controllata, altrimenti l'applicazione è vulnerabile agli attacchi replay.

--Malvezzi 12:45, 7 February 2007 (CET)