Question

Je tente de mettre en œuvre simple Single Sign On scénario dans lequel certains des serveurs participants seront fenêtres boîtes (IIS). Il ressemble à SPNEGO est un chemin raisonnable pour cela.

Voici le scénario:

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

Est-ce que son droit?

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

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

La solution

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

Rechercher dans calendarserver / twistedcaldav / authkerb.py pour la partie auth du serveur. Le module de Kerberos (qui est un module de c), ne possède pas de docstrings utiles, mais PyKerberos / pysrc / kerberos.py possède tous les définitions de fonctions.

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

Autres conseils

Jetez un oeil à la http://spnego.sourceforge.net/credential_delegation.html tutoriel. Il semble faire ce que vous essayez de faire.

J'ai cherché un certain temps pour quelque chose de similaire (sous Linux), qui m'a conduit à cette page plusieurs fois, mais donnant pas 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 un Active Directory, la configuration de l'authentification unique depuis un certain temps. Ce que j'étais déjà en mesure de le faire avant:

  • Utilisation de chrome avec une authentification unique sur Linux (avec une bonne configuration krb5, avec le domaine de travail utilisateur kinit de @)
  • python Ayant 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 authentification unique avec Kerberos sur Linux (en utilisant-gssapi python):

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)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top