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

用于使用Python的SSO的SPNEGO(kerberos令牌生成/验证),python,active-directory,single-sign-on,kerberos,spnego,Python,Active Directory,Single Sign On,Kerberos,Spnego,我正在尝试实现一个简单的单点登录场景,其中一些参与的服务器将是windows(IIS)机箱。看来SPNEGO是一条合理的途径 以下是场景: 用户使用其用户名和密码登录到我的SSO服务。我用某种机制验证了他的身份 稍后,用户希望访问应用程序A。 SSO服务会截获用户对应用程序A的请求。SSO服务使用SPNEGO将用户登录到应用程序A: SSO服务点击应用程序A的网页,获得“WWW-Authenticate:Negotiate”响应 SSO服务代表用户生成“授权:协商xxx”响应,响应应用程序

我正在尝试实现一个简单的单点登录场景,其中一些参与的服务器将是windows(IIS)机箱。看来SPNEGO是一条合理的途径

以下是场景:

  • 用户使用其用户名和密码登录到我的SSO服务。我用某种机制验证了他的身份
  • 稍后,用户希望访问应用程序A。
    • SSO服务会截获用户对应用程序A的请求。SSO服务使用SPNEGO将用户登录到应用程序A:
      • SSO服务点击应用程序A的网页,获得“WWW-Authenticate:Negotiate”响应
      • SSO服务代表用户生成“授权:协商xxx”响应,响应应用程序a。用户现在登录到应用程序a
    • SSO服务拦截后续用户对应用程序A的请求,在将其传递给应用程序A之前将授权标头插入其中
听起来对吗

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

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

这正是苹果公司利用其产品所做的。他们为流程的kerberos部分提供了一个库,以便实现

在CalendarServer/twistedcaldav/authkerb.py中查找服务器身份验证部分。 kerberos模块(是一个c模块)没有任何有用的docstring,但是PyKerberos/pysrc/kerberos.py具有所有函数定义

以下是svn中继的URL:


看一下本教程。它似乎在做你想做的事情。

我已经搜索了很长一段时间,寻找类似的东西(在Linux上),这让我多次来到这个页面,但没有给出答案。这是我的解决方案,我想到了:

web服务器是一个带有mod_auth_kerb的Apache。它已经在Active Directory中运行,单点登录安装已经有一段时间了。 我以前已经能够做到的是:

  • 在Linux上使用chromium和单点登录(使用正确的krb5设置,使用kinituser@domain)
  • 使用pywin32包中的sspi实现python连接和单点登录,类似于sspi.ClientAuth(“协商”,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)