2009-05-28 137 views
7

我试图实现一个简单的单点登录方案,其中一些参与的服务器将是窗口(IIS)复选框。看起来像SPNEGO是一个合理的路径。SPNEGO(Kerberos令牌生成/验证)为SSO使用Python

这里的情景:

  • 在使用自己的用户名和密码,我的SSO服务用户登录。我使用某种机制来验证他。
  • 在用户想要访问应用程序A.
    • 的用户为App的请求通过SSO服务截获一段时间以后。 SSO服务使用SPNEGO登录的用户到App答:
      • SSO服务点击应用程序的Web页面,得到了“WWW身份验证:协商”响应
      • SSO服务生成一个“授权:协商xxx“代表用户响应,响应App A.用户现在登录到App A.
    • SSO服务拦截App A的后续用户请求,在传递之前将授权标头插入到它们中他们到App A.

这听起来没错吗?

我需要两样东西(那我现在能想到的最):

  • 产生“授权:协商XXX”的情况下代表用户的令牌,最好使用Python
  • 的能够在Python中验证“授权:协商xxx”头文件(用于项目的后期部分)

回答

8

这正是苹果公司对其Calendar Server所做的。他们有一个python gssapi库,用于处理kerberos部分,以实现SPNEGO

查找范围CalendarServer/twistedcaldav/authkerb.py用于服务器授权部分。 在Kerberos模块(这是一个C模块),不具有任何有用的文档字符串,但PyKerberos/pysrc/kerberos.py具有所有函数定义。

这里的网址为SVN树干:
http://svn.calendarserver.org/repository/calendarserver/CalendarServer/trunk
http://svn.calendarserver.org/repository/calendarserver/PyKerberos/trunk

0

我一直在寻找相当长的一段时间类似(在Linux上)的东西,这使得我这个页面多次,但没有给出答案。因此,这里是我的解决方案,我想出了:

的Web服务器是一个mod_auth_kerb所阿帕奇。它已经运行在活动目录,单点登录设置,因为相当长的一段时间。 我是什么已经能够做到前:

  • 在Linux上使用单点登录铬(用适当的KRB5设置,与合作执行kinit用户@域)
  • 有蟒蛇连接和使用SSPI单点登录从pywin32包,喜欢的东西sspi.ClientAuth("Negotiate", targetspn="http/%s" % host)

下面的代码片段完成拼图(我需要),在使用Kerberos在Linux上有(使用python-GSSAPI)Python的单点登录:

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)