Pregunta

Estoy intentando implementar un escenario simple de inicio de sesión único en el que algunos de los servidores participantes serán cajas de Windows (IIS).Parece que SPNEGO es un camino razonable para esto.

Este es el escenario:

  • El usuario inicia sesión en mi servicio SSO utilizando su nombre de usuario y contraseña.Lo autentico usando algún mecanismo.
  • En algún momento posterior, el usuario desea acceder a la aplicación A.
    • El servicio SSO intercepta la solicitud del usuario para la aplicación A.El servicio SSO utiliza SPNEGO para iniciar la sesión del usuario en la Aplicación A:
      • El servicio SSO accede a la página web de la aplicación A y obtiene un mensaje "WWW-Authenticate:Negociar" respuesta
      • El servicio SSO genera una "Autorización:Negociar xxx" respuesta en nombre del usuario, responde a la Aplicación A.El usuario ahora ha iniciado sesión en la aplicación A.
    • El servicio SSO intercepta las solicitudes posteriores de los usuarios para la Aplicación A, insertando el encabezado de Autorización en ellas antes de pasarlas a la Aplicación A.

¿Suena bien?

Necesito dos cosas (al menos en lo que puedo pensar ahora):

  • la capacidad de generar la "Autorización:Negociar el token xxx" en nombre del usuario, preferiblemente usando Python
  • la capacidad de validar "Autorización:Negociar encabezados xxx" en Python (para una parte posterior del proyecto)
¿Fue útil?

Solución

Esto es exactamente lo que hace Apple con su Calendar Server . Tienen una pitón gssapi biblioteca para la parte del Kerberos del proceso, con el fin de aplicar SPNEGO .

Buscar en CalendarServer / twistedcaldav / authkerb.py para la parte de autenticación del servidor. El módulo de Kerberos (que es un módulo c), no tiene ningún docstrings útiles, pero PyKerberos / pysrc / kerberos.py tiene todas las definiciones de funciones.

Aquí están las direcciones URL de los troncos de SVN:
http://svn.calendarserver.org/repository/calendarserver/CalendarServer/trunk
http://svn.calendarserver.org/repository/calendarserver/PyKerberos/trunk

Otros consejos

Tome un vistazo a la http://spnego.sourceforge.net/credential_delegation.html tutorial. Parece estar haciendo lo que está tratando de hacer.

He estado buscando desde hace bastante tiempo por algo similar (en Linux), que me ha llevado a esta página varias veces, pero sin dar ninguna respuesta. Así que aquí está mi solución, que se me ocurrió:

El servidor web es un Apache con mod_auth_kerb. Ya se está ejecutando en un Active Directory, la configuración de inicio de sesión único desde hace bastante tiempo. Lo que ya era capaz de hacer antes:

  • Uso de cromo con el inicio de sesión único en Linux (con una configuración adecuada krb5, con el trabajo de dominio kinit usuario @)
  • Tener pitón conectar y utilizar inicio de sesión único sspi del paquete pywin32, con algo como sspi.ClientAuth("Negotiate", targetspn="http/%s" % host)

El siguiente fragmento de código completa el rompecabezas (y mis necesidades), que tiene Python inicio de sesión único con Kerberos en 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)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top