Domanda

Sto tentando di implementare un semplice scenario Single Sign On in cui alcuni dei server partecipanti saranno caselle Windows (IIS).Sembra che SPNEGO sia un percorso ragionevole per questo.

Ecco lo scenario:

  • L'utente accede al mio servizio SSO utilizzando il suo nome utente e la sua password.Lo autentico usando qualche meccanismo.
  • In un secondo momento l'utente desidera accedere all'app A.
    • La richiesta dell'utente per l'app A viene intercettata dal servizio SSO.Il servizio SSO utilizza SPNEGO per accedere all'utente all'app A:
      • Il servizio SSO accede alla pagina Web dell'app A e ottiene un messaggio "WWW-Authenticate:Risposta "negoziare".
      • Il servizio SSO genera una "Autorizzazione:Negozia xxx" per conto dell'utente, risponde all'app A.L'utente è ora connesso all'app A.
    • Il servizio SSO intercetta le successive richieste degli utenti per l'App A, inserendo in esse l'intestazione Authorization prima di trasmetterle all'App A.

Ti sembra giusto?

Ho bisogno di due cose (almeno questo mi viene in mente adesso):

  • la possibilità di generare la "Autorizzazione:Negozia il token xxx" per conto dell'utente, preferibilmente utilizzando Python
  • la possibilità di convalidare "Autorizzazione:Negozia le intestazioni xxx" in Python (per una parte successiva del progetto)
È stato utile?

Soluzione

Questo è esattamente ciò che fa Apple con i suoi Server del calendario.Loro hanno un pitone gssapi libreria per la parte Kerberos del processo, al fine di implementare SPNEGO.

Cerca in CalendarServer/twistedcaldav/authkerb.py la parte di autenticazione del server.Il modulo Kerberos (che è un modulo C), non ha alcuna docstring utile, ma PyKerberos/pysrc/kerberos.py ha tutte le definizioni delle funzioni.

Ecco gli URL per i trunk svn:
http://svn.calendarserver.org/repository/calendarserver/CalendarServer/trunk
http://svn.calendarserver.org/repository/calendarserver/PyKerberos/trunk

Altri suggerimenti

Dai un'occhiata a http://spnego.sourceforge.net/credential_delegation.html tutorial.Sembra che stia facendo quello che stai cercando di fare.

È da un po' di tempo che cerco qualcosa di simile (su Linux), che mi ha portato più volte a questa pagina, senza però dare risposta.Quindi ecco la mia soluzione, mi è venuta in mente:

Il server web è un Apache con mod_auth_kerb.È già in esecuzione in Active Directory, configurazione Single Sign-On da un po' di tempo.Quello che potevo già fare prima:

  • Utilizzo di Chromium con Single Sign-On su Linux (con una corretta configurazione di krb5, con kinit utente@dominio funzionante)
  • Avere Python Connect e Single Sign-On utilizzando sspi dal pacchetto pywin32, con qualcosa del genere sspi.ClientAuth("Negotiate", targetspn="http/%s" % host)

Il seguente frammento di codice completa il puzzle (e le mie esigenze), avendo Python single sign-on con Kerberos su Linux (usando python-gssapi):

in_token=base64.b64decode(neg_value)
service_name = gssapi.Name("HTTP@%s" % host, gssapi.C_NT_HOSTBASED_SERVICE)
spnegoMechOid = gssapi.oids.OID.mech_from_string("1.3.6.1.5.5.2")
ctx = gssapi.InitContext(service_name,mech_type=spnegoMechOid)
out_token = ctx.step(in_token)
buffer = sspi.AuthenticationBuffer()
outStr = base64.b64encode(out_token)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top