您没有说明您使用的是什么 Web 服务器,但是在 Apache 上,我建议您将 mod_shib Apache 模块与 Django 身份验证中间件结合使用。
概括地说,您将让 Apache/mod_shib 完成 SAML 繁重的工作并与 IdP 交互,您将让 Django 为您管理用户。您将使用一个 Django 身份验证中间件将两者连接起来,该中间件使用 REMOTE_USER 环境变量对用户进行身份验证,以便在 Apache 和 Django 应用程序之间进行通信。
因此,首先按照 Django 文档中的说明使用 Django 身份验证设置 Django。验证您可以使用管理工具创建用户,并且您可以使用 Django 身份验证方法登录并建立会话。
一旦你有简单的本地登录工作,安装 RemoteUser 中间件并验证,通过设置 REMOTE_USER 环境变量,你可以让你的 Django 应用程序登录用户(你可以在本地使用开发服务器进行所有这些测试在您的开发机器上)。
一旦您证明您可以通过设置 REMOTE_USER 环境来登录用户,您需要安装 Apache shibboleth 模块 mod_shib 并使用它来保护您的应用程序的根目录。
假设您的应用程序位于 /mysite,您的虚拟主机部分中的配置将包括:
<Location /mysite>
ShibRequestSetting redirectToSSL 443
AuthType shibboleth
ShibRequestSetting requireSession 1
Require valid-user
</Location>
该配置将告诉 apache /mysite 路径需要 mod_shib 参与并强制通过 ssl/tls 进行通信。
我不会完成安装和配置 shibboleth 所需的所有配置步骤,但基本上,您希望使用 REMOTE_USER=eppn 设置应用程序默认值(shibboleth2.xml 文件)(如果您想使用其他属性,如 eptid 你会指定);这告诉模块将哪个属性填充到 REMOTE_USER 环境变量中。同样,这里的 shib 文档非常清楚,因此我不会详细介绍如何重定向到您的大学 IdP,但基本上,您将在表单的 Sessions 部分创建一个条目:
<SSO entityID="https://idp.testshib.org/idp/shibboleth">
您可以将您的 IdP 位置替换为上面显示的 testhib URL。
请注意,我们将 REMOTE_USER 设置为 eppn 值,并且该值将被 Django auth 中间件解释为用户的用户名;您需要使用与他们的 eppn 相同的用户名创建 Django 用户才能使其正常工作。您还可以允许 Django 自动配置新帐户,例如,如果您认为 IdP 身份验证有足够的证据来创建新用户帐户,但是通过自动配置,只有最少的位被设置;您仍然需要进入该帐户并设置名字、姓氏、电话等。
最终效果是,每当未经身份验证的用户尝试访问 /mysite 下的位置时,他们将被重定向到您的大学 IdP,他们将在那里登录并被重定向回来。 mod_shib 模块(与在后台运行的 shibd 守护程序一起)将处理属性解包和与 IdP 的会话状态,并将在 REMOTE _USER 环境变量中设置 eppn 值。假设您的 Django 应用程序已使用 apache 正确设置,它将被调用,并且 RemoteUser 中间件将使用在 REMOTE_USER 环境变量中设置的 eppn 值在身份验证数据库中查找具有该用户名的用户。如果找到用户,则完成Django登录过程(即在请求中设置用户对象,设置会话状态等)
还有一件事。要与您的大学 IdP 交谈并让它向您的应用程序(即 eppn)发布属性,您需要做三件事:
- 导入他们的 IdP 元数据
- 导出您的 SP 元数据并让您的大学身份人员导入它
- 让您的大学身份团队向您发布 eppn
请注意,这三个步骤可能是一个挑战,并且可能需要大量的时间和功课。
还有一件事:我建议将 SAML 设置与您的 Django 应用程序/中间件集成分开验证。使用您熟悉的最简单的机制(简单的 wsgi 应用程序、php 脚本等)创建一个页面,该页面将在浏览时简单地转储 REMOTE_USER 环境变量,然后首先保护它。一旦您将该页面重定向到您的 IdP 并在返回时将正确的 eppn 转储到 REMOTE_USER 中,您就可以继续使用 Django 位。