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

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

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

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

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

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

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

Ответы [ 3 ]

8 голосов
/ 16 июня 2009

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

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

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

0 голосов
/ 03 декабря 2015

Я довольно долго искал нечто подобное (в 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)
0 голосов
/ 04 ноября 2009

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

...