SPNEGO (генерация / проверка токена Kerberos) для единого входа с использованием Python

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

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

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

Это звучит правильно?

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

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

3 ответа

Решение

Это именно то, что Apple делает со своим сервером календарей. У них есть библиотека Python Gssapi для Kerberos часть процесса, чтобы реализовать SPNEGO.

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

Вот URL-адреса для стволов SVN:
http://svn.calendarserver.org/repository/calendarserver/CalendarServer/trunk
http://svn.calendarserver.org/repository/calendarserver/PyKerberos/trunk

Взгляните на http://spnego.sourceforge.net/credential_delegation.html учебное пособие. Кажется, что ты делаешь то, что пытаешься сделать.

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

Веб-сервер - это Apache с mod_auth_kerb. Он уже запущен в Active Directory, настройка единого входа уже довольно давно. Что я уже смог сделать раньше:

  • Использование хрома с единым входом в Linux (с правильной настройкой krb5, с рабочим kinit user@domain)
  • Наличие Python Connect и единого входа с использованием sspi из пакета pywin32, с чем-то вроде sspi.ClientAuth("Negotiate", targetspn="http/%s" % host)

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