2009-05-28 5 views
7

Я пытаюсь реализовать простой сценарий Single Sign On, в котором некоторые из участвующих серверов будут окнами (IIS). Похоже, SPNEGO - разумный путь для этого.SPNEGO (генерация/проверка токенов kerberos) для SSO с использованием Python

Вот сценарий:

  • пользователь входит в мои службы единого входа с использованием своего имени пользователя и пароля. Я удостоверяю его, используя какой-то механизм.
  • В более позднее время пользователь хочет получить доступ к App A.
    • запрос пользователя для приложения А перехватывается службы единого входа. Служба единого входа использует SPNEGO для входа пользователя, чтобы App A:
      • служба SSO попадает на веб-страницу App A, получает "WWW-Authenticate: Negotiate" ответ
      • служба SSO генерирует «Авторизация: Negotiate xxx "от имени пользователя, отвечает на приложение A. Теперь пользователь зарегистрирован в приложении A.
    • Служба SSO перехватывает последующие пользовательские запросы для приложения A, вставляя в них заголовок авторизации перед передачей их на приложение А.

Звучит ли это правильно?

мне нужны две вещи (по крайней мере, что я могу думать сейчас):

  • способность генерировать «авторизации: Negotiate ххх» маркер от имени пользователя, желательно с использованием Python
  • в способность проверять заголовки «Authorization: Negotiate xxx» в Python (для более поздней части проекта)

ответ

8

Это именно то, что Apple делает со своим Calendar Server. У них есть библиотека python gssapi для части kerberos процесса, чтобы реализовать SPNEGO.

Просмотрите вариант CalendarServer/twistedcaldav/authkerb.py для части сервера auth. Модуль kerberos (который является модулем c), не имеет никаких полезных док-строк, но PyKerberos/pysrc/kerberos.py имеет все определения функций.

Вот URL, для СВН стволов:
http://svn.calendarserver.org/repository/calendarserver/CalendarServer/trunk
http://svn.calendarserver.org/repository/calendarserver/PyKerberos/trunk

0

Я искал довольно много времени для чего-то подобного (на Linux), что привело меня к этой странице несколько раз, но не давало ответа. Итак, вот мое решение, я придумал:

Веб-сервер - это Apache с mod_auth_kerb. Он уже работает в режиме Active Directory, с одним подключением, так как довольно давно. То, что я уже был в состоянии сделать раньше:

  • Использование хрома с одним знаком на на Linux (с правильной настройки krb5 с рабочей Kinit пользователь @ домен)
  • Имея питона подключения и единый вход с использованием SSPI из пакета pywin32, с чем-то вроде sspi.ClientAuth("Negotiate", targetspn="http/%s" % host)

следующий фрагмент кода завершает загадку (и мои потребности), имея Python единый вход с Kerberos на Linux (с помощью питона-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)