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

2024-04-29 03:11:43 发布

您现在位置:Python中文网/ 问答频道 /正文

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

下面是场景:

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

听起来对吗?

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

  • 能够代表用户生成“Authorization:Negotiate xxx”令牌,最好使用Python
  • 在Python中验证“Authorization:Negotiate xxx”头的能力(用于项目的稍后部分)

Tags: 用户服务器应用程序windows场景代表iisspnego
3条回答

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

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

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

下面的代码片段完成了这一难题(以及我的需要),其中使用了Python single sign on with Kerberos on Linux(使用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)

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

这正是苹果对其Calendar Server所做的。它们有一个用于进程kerberos部分的python gssapi库,以便实现SPNEGO

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

以下是svn中继的URL:
http://svn.calendarserver.org/repository/calendarserver/CalendarServer/trunk
http://svn.calendarserver.org/repository/calendarserver/PyKerberos/trunk

相关问题 更多 >