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

9
我试图实现一个简单的单点登录场景,其中一些参与的服务器将是Windows(IIS)服务器。看起来SPNEGO是一个合理的路径。
以下是场景:
- 用户使用用户名和密码登录我的SSO服务。我使用某种机制对他进行身份验证。 - 在以后的某个时间,用户想要访问App A。
- 用户对App A的请求被SSO服务拦截。 SSO服务使用SPNEGO登录用户到App A:
- SSO服务访问App A网页,获取“WWW-Authenticate:Negotiate”响应 - SSO服务代表用户生成“Authorization:Negotiate xxx”响应,响应App A。用户现在已登录到App A。
- SSO服务拦截后续用户对App A的请求,在将它们传递给App A之前插入Authorization标头。
这听起来正确吗?
我需要两件事情(至少我现在能想到的):
- 能够代表用户生成“Authorization:Negotiate xxx”令牌,最好使用Python - 能够在Python中验证“Authorization:Negotiate xxx”标头(用于项目的后续部分)
3个回答

8
这正是苹果公司在其日历服务器上所做的。他们有一个Python GSSAPI库用于Kerberos部分的过程,以实现SPNEGO
在CalendarServer/twistedcaldav/authkerb.py中查找服务器认证部分。Kerberos模块(一个C模块)没有任何有用的docstrings,但PyKerberos/pysrc/kerberos.py有所有函数定义。
以下是svn主干的URL:
http://svn.calendarserver.org/repository/calendarserver/CalendarServer/trunk
http://svn.calendarserver.org/repository/calendarserver/PyKerberos/trunk

0

0

我已经寻找了相似的东西很长一段时间(在Linux上),这导致我多次进入此页面,但没有得到答案。所以这是我的解决方案:

Web服务器是带有mod_auth_kerb的Apache。它已经在Active Directory中运行了一段时间,单点登录设置。

我之前已经能够做到以下几点:

  • 使用具有适当krb5设置的Linux上的Chromium进行单点登录(使用有效的kinit user@domain)
  • 使用来自pywin32包的sspi,例如sspi.ClientAuth("Negotiate", targetspn="http/%s" % host),连接并进行单点登录

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接