2009-05-28 6 views
7

Je tente d'implémenter un scénario de Single Sign On simple dans lequel certains des serveurs participants seront des boîtes Windows (IIS). Il semble que SPNEGO est un chemin raisonnable pour cela.SPNEGO (génération/validation de jeton kerberos) pour SSO utilisant Python

Voici le scénario:

  • journaux utilisateur dans mon service SSO en utilisant son nom d'utilisateur et mot de passe. Je l'authentifie en utilisant un mécanisme.
  • À un certain moment plus tard, l'utilisateur souhaite accéder à App A.
    • demande de l'utilisateur pour App A est intercepté par le service d'authentification unique. Le service d'authentification unique utilise SPNEGO pour connecter l'utilisateur à l'App A:
      • Le service d'authentification unique frappe l'App Une page Web, obtient un "WWW-Authenticate: Negotiate" réponse
      • Le service d'authentification unique génère une « autorisation: Negotiate xxx » réponse au nom de l'utilisateur, répond à l'App A. l'utilisateur est maintenant connecté à l'App A.
    • les interceptent de service d'authentification unique des demandes ultérieures de l'utilisateur pour App A, insérer l'en-tête d'autorisation dans les avant de passer les sur l'application A.

Cela vous semble-t-il correct?

je besoin de deux choses (au moins que je peux penser maintenant):

  • la capacité de générer le « Autorisation: Negotiate xxx » jeton au nom de l'utilisateur, de préférence en utilisant Python
  • la possibilité de valider les en-têtes "Authorization: Negotiate xxx" en Python (pour une partie ultérieure du projet)

Répondre

8

C'est exactement ce que fait Apple avec ses Calendar Server. Ils ont une bibliothèque python gssapi pour la partie kerberos du processus, afin de mettre en œuvre SPNEGO.

Regardez dans CalendarServer/twistedcaldav/authkerb.py pour la partie d'authentification du serveur. Le module kerberos (qui est un module c) n'a pas de docstrings utiles, mais PyKerberos/pysrc/kerberos.py a toutes les définitions de fonctions.

est ici les urls pour les troncs svn:
http://svn.calendarserver.org/repository/calendarserver/CalendarServer/trunk
http://svn.calendarserver.org/repository/calendarserver/PyKerberos/trunk

0

J'ai cherché un peu de temps pour quelque chose de similaire (sur Linux), qui m'a conduit à cette page plusieurs fois, sans donner de réponse. Donc, voici ma solution, je suis venu avec:

Le serveur web est un Apache avec mod_auth_kerb. Il est déjà en cours d'exécution dans une configuration de connexion unique Active Directory depuis un certain temps. Ce que j'étais déjà en mesure de le faire avant:

  • En utilisant le chrome avec authentification unique sur Linux (avec une bonne configuration krb5, avec le travail utilisateur @ domaine kinit)
  • python Avoir connecter et signe unique sur l'utilisation sspi du paquet pywin32, avec quelque chose comme sspi.ClientAuth("Negotiate", targetspn="http/%s" % host)

l'extrait de code suivant complète le casse-tête (et mes besoins), ayant Python connexion unique avec Kerberos sur Linux (en utilisant-gssapi python):

in_token=base64.b64decode(neg_value) 
service_name = gssapi.Name("[email protected]%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) 
Questions connexes