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 的后续请求,将 Authorization 标头插入其中,然后再将其传递给 App A。

听起来对吗?

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

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

3 回答 3

8

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

在 CalendarServer/twistedcaldav/authkerb.py 中查找服务器身份验证部分。kerberos 模块(即 ac 模块)没有任何有用的文档字符串,但 PyKerberos/pysrc/kerberos.py 具有所有函数定义。

这是 svn 中继的网址:http: //svn.calendarserver.org/repository/calendarserver/CalendarServer/trunk
http://svn.calendarserver.org/repository/calendarserver/PyKerberos/trunk

于 2009-06-16T13:49:51.233 回答
0

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

于 2009-11-04T16:19:56.740 回答
-1

我一直在寻找类似的东西(在 Linux 上),这导致我多次访问此页面,但没有给出答案。所以这是我的解决方案,我想出了:

网络服务器是一个带有 mod_auth_kerb 的 Apache。很长一段时间以来,它已经在 Active Directory、单点登录设置中运行。我之前已经能够做到的:

  • 在 Linux 上使用具有单点登录的 chromium(使用正确的 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)
于 2015-12-03T19:10:44.937 回答