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

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

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

  • Пользователь входит в мою службу единого входа, используя свое имя пользователя и пароль. Я удостоверяю его личность, используя какой-то механизм.
  • At some later time the user wants to access App A.
    • The user's request for App A is intercepted by the SSO service. The SSO service uses SPNEGO to log the user in to App A:
      • The SSO service hits the App A web page, gets a "WWW-Authenticate: Negotiate" response
      • Служба единого входа генерирует ответ «Авторизация: переговоры xxx» от имени пользователя и отвечает приложению A. Теперь пользователь вошел в приложение A.
    • Служба единого входа перехватывает последующие запросы пользователей для приложения A, вставляя в них заголовок авторизации, прежде чем передать их в приложение A.

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

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

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

person Parand    schedule 28.05.2009    source источник


Ответы (3)


Именно это делает 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

person JimB    schedule 16.06.2009

Ознакомьтесь с руководством по http://spnego.sourceforge.net/credential_delegation.html. Кажется, вы делаете то, что пытаетесь сделать.

person Pat Gonzalez    schedule 04.11.2009

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

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

  • Использование хрома с единым входом в 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)
person Rapsack    schedule 03.12.2015