【问题标题】:SPNEGO (kerberos token generation/validation) for SSO using Python使用 Python 进行 SSO 的 SPNEGO(kerberos 令牌生成/验证)
【发布时间】:2009-05-28 19:40:12
【问题描述】:

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

这是场景:

  • 用户使用他的用户名和密码登录到我的 SSO 服务。我使用某种机制对他进行身份验证。
  • 稍后用户想要访问应用程序 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 中验证“Authorization: Negotiate xxx”标头(用于项目的后续部分)

【问题讨论】:

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


    【解决方案1】:

    这正是 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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

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

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

        以下代码 sn-p 完成了这个难题(以及我的需要),在 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)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-05-06
          • 1970-01-01
          • 1970-01-01
          • 2010-09-25
          • 2011-05-29
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多