سؤال

أحاول تنفيذ سيناريو علامة واحدة واحدة بسيطة حيث ستكون بعض الخوادم المشاركة مربعات Windows (IIS). يبدو أن SPNEGO هو طريق معقول لهذا.

إليك السيناريو:

  • سجلات المستخدم في خدمة SSO الخاصة بي باستخدام اسم المستخدم وكلمة المرور الخاصة به. أنا مصادقة عليه باستخدام بعض الآلية.
  • في بعض الوقت لاحقا، يريد المستخدم الوصول إلى التطبيق A.
    • يتم اعتراض طلب المستخدم الخاص ب App A بواسطة خدمة SSO. تستخدم خدمة SSO SPNEGO لتسجيل المستخدم في التطبيق A:
      • خدمة SSO تضرب التطبيق صفحة ويب، يحصل على استجابة "مصادقة WWW: تفاوض"
      • تقوم خدمة SSO بإنشاء "إذن: التفاوض XXX" استجابة نيابة عن المستخدم، ويستجيب لتطبيق A. يتم الآن تسجيل الدخول إلى التطبيق A.
    • تعترض خدمة SSO طلبات المستخدم اللاحقة للتطبيق A، وإدخال رأس التفويض فيها قبل اجتيازها إلى التطبيق A.

هل هذا يبدو صحيحا؟

أحتاج إلى شيئين (على الأقل أستطيع أن أفكر في الآن):

  • القدرة على توليد "التفويض: التفاوض XXX" رمزية نيابة عن المستخدم، ويفضل أن تستخدم بيثون
  • القدرة على التحقق من صحة "التفويض: التفاوض XXX" في بيثون (لجزء لاحق من المشروع)
هل كانت مفيدة؟

المحلول

هذا هو بالضبط ما يفعله Apple مع خادم التقويم. وبعد لديهم أ بيثون gssapi. مكتبة لجزء Kerberos من العملية، من أجل التنفيذ SPNEGO..

ابحث في التقويم / 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/credenty_delegation.html. الدورة التعليمية. يبدو أن تفعل ما تحاول القيام به.

لقد كنت أبحث عن بعض الوقت لشيء مماثل (على Linux)، والتي تقودني إلى هذه الصفحة عدة مرات، ولكن لا تعطي إجابة. لذلك هنا هو الحل، لقد توصلت إلى:

خادم الويب هو Apache مع mod_auth_kerb. يعمل بالفعل في Active Directory، إعداد تسجيل الدخول الفردي منذ بعض الوقت. ما كنت قادرا بالفعل على القيام به قبل:

  • باستخدام Chromium مع تسجيل الدخول الفردي على Linux (مع إعداد KRB5 مناسب، مع مستخدم Kinit المستخدم @ المجال)
  • وجود Python Connect و تسجيل الدخول الفردي على استخدام SSPI من حزمة Pywin32، مع شيء من هذا القبيل sspi.ClientAuth("Negotiate", targetspn="http/%s" % host)

يكمل مقتطف التعليمات البرمجية التالي اللغز (وتلبي احتياجاتي)، بعد تسجيل الدخول إلى 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