2009-05-28 9 views
7

Estoy intentando implementar un escenario simple de inicio de sesión único donde algunos de los servidores participantes serán cuadros de Windows (IIS). Parece que SPNEGO es una ruta razonable para esto.SPNEGO (generación/validación de token de kerberos) para SSO con Python

Este es el escenario:

  • usuario entra en mi servicio de SSO utilizando su nombre de usuario y contraseña. Lo autentico usando algún mecanismo.
  • En algún momento posterior el usuario quiere acceder a la aplicación A.
    • petición del usuario para la aplicación A es interceptada por el servicio SSO. El servicio SSO utiliza SPNEGO para iniciar la sesión del usuario para la aplicación A:
      • el servicio SSO golpea en la página web de la aplicación A, consigue un "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 está conectado a App A.
    • los SSO intercepta las peticiones de los usuarios de servicios posteriores para la aplicación a, insertar el encabezado de autorización en ellos antes de pasar en la aplicación A.

¿Suena bien?

necesito dos cosas (al menos que se me ocurre ahora):

  • la capacidad de generar la "Autorización: Negociar xxx" señal en nombre del usuario, preferentemente usando Python
  • la capacidad de validar "Autorización: Negociar xxx" cabeceras en Python (para una parte posterior del proyecto)

Respuesta

8

Esto es exactamente lo que hace Apple con su Calendar Server. Tienen una biblioteca python gssapi para la parte kerberos del proceso, con el fin de implementar SPNEGO.

Busque en CalendarServer/twistedcaldav/authkerb.py la parte de autenticación del servidor. El módulo kerberos (que es un módulo c) no tiene ninguna documentación útil, pero PyKerberos/pysrc/kerberos.py tiene todas las definiciones de función.

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

0

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

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

  • El uso de cromo con el inicio de sesión único en Linux (con una configuración adecuada krb5, con el usuario @ dominio kinit de trabajo)
  • Tener pitón conectar y inicio de sesión único utilizando 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("[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) 
Cuestiones relacionadas