Python Django中的SAML/Shibb身份验证

Python Django中的SAML/Shibb身份验证,python,django,saml,shibboleth,Python,Django,Saml,Shibboleth,我是Django的新手,但我知道如何用python Django创建一个简单的应用程序,如何添加新页面,如何将其链接到url文件等 现在我正在尝试做的是,我正在尝试创建一个非常简单的webapp,在登录页面上我将有一个登录链接 当用户点击此链接时,它应该进入乔治华盛顿大学认证窗口,然后我可以输入我的大学证书,它应该进行认证并返回到一个页面,说明**登录成功** 我看过很多教程,但看起来都很混乱 我已经安装了xmlsec1、pysaml2、djangosaml2模块,但即使在那之后,我也不知道下一

我是Django的新手,但我知道如何用python Django创建一个简单的应用程序,如何添加新页面,如何将其链接到url文件等

现在我正在尝试做的是,我正在尝试创建一个非常简单的webapp,在登录页面上我将有一个登录链接

当用户点击此链接时,它应该进入乔治华盛顿大学认证窗口,然后我可以输入我的大学证书,它应该进行认证并返回到一个页面,说明**登录成功**

我看过很多教程,但看起来都很混乱

我已经安装了xmlsec1、pysaml2、djangosaml2模块,但即使在那之后,我也不知道下一步该怎么做。我从未像现在这样对这个认证模块感到如此无知


如果有人能指导我这个过程,那就太好了

您没有说明您使用的是什么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应用程序让用户登录(您可以在开发机器上本地使用开发服务器进行所有这些测试)

一旦证明可以通过设置远程用户环境来登录用户,就需要安装Apache shibboleth模块mod_shib并使用它来保护应用程序的根

假设您的应用程序位于/mysite,virtualhost部分中的配置将包括:

<Location /mysite>
    ShibRequestSetting redirectToSSL 443
    AuthType shibboleth
    ShibRequestSetting requireSession 1
    Require valid-user
</Location>

SHIBREQUESTSL 443
身份验证类型shibboleth
ShibRequestSetting要求会话1
需要有效用户
该配置将告诉apache/mysite路径需要mod_shib参与,并强制通过ssl/tls进行通信

我将不介绍安装和配置shibboleth所需的所有配置步骤,但基本上,您希望使用REMOTE_USER=eppn设置应用程序默认值(shibboleth2.xml文件)(如果您希望使用另一个属性,如eptid,您将指定该属性);这将告诉模块在远程用户环境变量中填充哪个属性。同样,shib文档在这里非常清楚,因此我不会详细介绍如何重定向到您的大学IdP,但基本上,您将在表单的会话部分创建一个条目:

<SSO entityID="https://idp.testshib.org/idp/shibboleth">

您可以将IdP位置替换为上面显示的testshib URL

注意,我们正在将REMOTE_USER设置为eppn值,该值将由Django auth中间件解释为用户的用户名;您需要创建Django用户,其用户名与其eppn相同,这样才能工作。您还可以允许Django自动设置新帐户,例如,如果您认为IdP身份验证足以创建新用户帐户,但通过自动设置,仅设置最小的位;您仍然需要进入该帐户并设置名字、姓氏、电话等

其净效果是,每当未经验证的用户试图访问/mysite下的位置时,他们将被重定向到您的大学IdP,他们将在那里登录并被重定向回。mod_shib模块(与后台运行的shibd守护进程一起)将处理属性解包和IdP的会话状态,并将在远程用户环境变量中设置eppn值。假设您的Django应用程序是使用apache正确设置的,将调用该应用程序,RemoteUser中间件将使用REMOTE_用户环境变量中设置的eppn值在身份验证数据库中查找具有该用户名的用户。如果找到用户,它将完成Django登录过程(即在请求中设置用户对象、设置会话状态等)

还有一件事。要与您的大学IdP交谈并将其发布属性添加到您的应用程序(即eppn),您需要做三件事:

  • 导入他们的IdP元数据
  • 导出您的SP元数据并让您的大学标识人员导入它
  • 让你的大学身份团队向你发布eppn
  • 请注意,这三个步骤可能是一个挑战,可能需要大量的时间和家庭作业

    还有一件事:我建议将SAML设置与Django应用程序/中间件集成分开进行验证。使用您熟悉的最简单机制(简单的wsgi应用程序、php脚本等)创建一个页面,在浏览时只需转储远程用户环境变量,然后首先保护该变量。一旦页面重定向到IdP并在返回时将正确的eppn转储到REMOTE_USER中,就可以转到Django位