使用Python的SSO的SPNEGO(kerberos令牌生成/验证)

时间:2009-05-28 19:40:12

标签: python active-directory single-sign-on kerberos spnego

我正在尝试实现一个简单的单点登录方案,其中一些参与的服务器将是Windows(IIS)框。看起来SPNEGO是一条合理的道路。

以下是该方案:

  • 用户使用他的用户名和密码登录我的SSO服务。我使用某种机制对他进行身份验证。
  • 稍后用户想要访问App A.
    • SSO服务拦截用户对App A的请求。 SSO服务使用SPNEGO将用户登录到App A:
      • SSO服务点击App A网页,获得“WWW-Authenticate:Negotiate”回复
      • SSO服务代表用户生成“授权:协商xxx”响应,响应App A.用户现在已登录到App A.
    • SSO服务拦截后续用户对App A的请求,在将其传递给App A之前插入Authorization标头。

这听起来不错吗?

我需要两件事(至少我现在能想到的):

  • 代表用户生成“Authorization:Negotiate xxx”令牌的能力,最好是使用Python
  • 在Python中验证“授权:协商xxx”标题的能力(对于项目的后续部分)

3 个答案:

答案 0 :(得分:8)

这正是Apple对其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

答案 1 :(得分:0)

查看http://spnego.sourceforge.net/credential_delegation.html教程。它似乎正在做你想要做的事情。

答案 2 :(得分:-1)

我已经花了很长时间搜索类似的东西(在Linux上),这导致我多次访问此页面但却没有回答。所以这是我的解决方案,我想出了:

Web服务器是带有mod_auth_kerb的Apache。它已经在Active Directory中运行,单点登录设置已经有一段时间了。 我以前能够做的事情:

  • 在Linux上使用带有单点登录的铬(使用适当的krb5设置,使用kinit user @ domain)
  • 使用pywin32包中的sspi进行python连接和单点登录,类似sspi.ClientAuth("Negotiate", targetspn="http/%s" % host)

以下代码片段完成了这个难题(以及我的需求),在Linux上使用Kerberos进行Python单点登录(使用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)