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

StackOverflow https://stackoverflow.com/questions/922805

Вопрос

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

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

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

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

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

  • возможность генерировать "Авторизацию:Согласовывать токен "xxx" от имени пользователя, предпочтительно используя Python
  • возможность проверки "Авторизации:Согласование заголовков "xxx" на Python (для более поздней части проекта)
Это было полезно?

Решение

Это именно то, что Apple делает со своими Сервер календаря.У них есть python gssapi библиотека для части процесса kerberos, позволяющая реализовать ВТОРОГО.

Посмотрите в разделе 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

Другие советы

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

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

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

  • Использование chromium с единым входом в Linux (с правильной настройкой krb5, с работающим kinit user@domain)
  • Подключение python и единый вход с использованием 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)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top