2009-05-28 42 views
7

Tôi đang cố gắng triển khai kịch bản Đăng nhập một lần đơn giản, nơi một số máy chủ tham gia sẽ là các hộp windows (IIS). Có vẻ như SPNEGO là một con đường hợp lý cho việc này.SPNEGO (tạo/xác thực mã thông báo kerberos) cho SSO bằng cách sử dụng Python

Đây là kịch bản:

  • dùng đăng nhập vào dịch vụ SSO của tôi sử dụng tên đăng nhập và mật khẩu của mình. Tôi xác thực anh ta bằng cách sử dụng một số cơ chế.
  • Vào một thời gian sau đó, người dùng muốn truy cập vào ứng dụng A.
    • Yêu cầu của người dùng đối với ứng dụng A bị chặn bởi dịch vụ SSO. Các dịch vụ SSO sử dụng Spnego để đăng nhập người sử dụng trong App A:
      • dịch vụ SSO lượt truy cập các trang web App A, nhận được một "WWW-Authenticate: Negotiate" phản ứng
      • dịch vụ SSO tạo ra một "ủy quyền: Đàm phán phản hồi xxx "thay mặt cho người dùng, phản hồi ứng dụng A. Người dùng hiện đã đăng nhập vào ứng dụng A.
    • Dịch vụ SSO chặn các yêu cầu người dùng tiếp theo đối với ứng dụng A, chèn tiêu đề Cấp phép vào chúng trước khi vượt qua chúng trên ứng dụng A.

Điều đó có đúng không?

tôi cần hai điều (ít nhất mà tôi có thể nghĩ đến bây giờ):

  • khả năng để tạo ra "Authorization: Negotiate xxx" token trên danh nghĩa của người sử dụng, tốt nhất là sử dụng Python
  • sự khả năng xác nhận tiêu đề "Ủy quyền: Thương lượng xxx" bằng Python (cho phần sau của dự án)

Trả lời

8

Đây chính xác là những gì Apple làm với Calendar Server. Họ có một thư viện python gssapi cho phần kerberos của quá trình, để thực hiện SPNEGO.

Tìm trong CalendarServer/twistedcaldav/authkerb.py cho phần auth của máy chủ. Mô-đun kerberos (là một mô-đun c), không có bất kỳ tài liệu hữu ích nào, nhưng PyKerberos/pysrc/kerberos.py có tất cả các định nghĩa hàm.

Dưới đây là các url cho thân svn:
http://svn.calendarserver.org/repository/calendarserver/CalendarServer/trunk
http://svn.calendarserver.org/repository/calendarserver/PyKerberos/trunk

0

Tôi đã tìm kiếm khá nhiều thời gian cho một cái gì đó tương tự (trên Linux), điều này đã dẫn tôi đến trang này nhiều lần, nhưng không đưa ra câu trả lời nào. Vì vậy, đây là giải pháp của tôi, tôi đã đưa ra:

Máy chủ web là một Apache với mod_auth_kerb. Nó đã chạy trong Active Directory, thiết lập đăng nhập một lần từ khá lâu. Những gì tôi đã đã có thể làm trước đây:

  • Sử dụng crom với dấu hiệu duy nhất trên trên Linux (với một thiết lập krb5 thích hợp với làm việc kinit user @ domain)
  • Có python kết nối và dấu hiệu duy nhất về việc sử dụng sspi từ gói PyWin32, với một cái gì đó giống như sspi.ClientAuth("Negotiate", targetspn="http/%s" % host)

đoạn mã sau đây hoàn thành các câu đố (và nhu cầu của tôi), có Python dấu hiệu duy nhất trên với Kerberos trên Linux (sử dụng python-GSSAPI):

in_token=base64.b64decode(neg_value) 
service_name = gssapi.Name("[email protected]%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) 
Các vấn đề liên quan