python - Django中的SAML/Shibb身份验证

标签 python django saml shibboleth

我是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应用程序登录用户(您可以在开发本地使用开发服务器进行所有这些测试。机)。

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

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

<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 doc在这里非常清晰,因此我不会详细介绍如何重定向到您的大学IdP,但基本上,您将在表单的“会话”部分中创建一个条目:

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


您将用IdP位置代替上面显示的testshib URL的位置。

请注意,我们将REMOTE_USER设置为eppn值,并且该值将由Django auth中间件解释为用户的用户名;您需要使用用户名与其eppn相同的用户名创建Django用户,此功能才能正常工作。例如,如果您认为IdP身份验证有足够的证据来创建新的用户帐户,则还可以允许Django自动设置新帐户;但是,使用自动设置,仅需设置最少的比特即可;您仍然需要进入该帐户并设置名字,姓氏,电话等。

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

还有一件事。要与大学IdP对话并使其释放应用程序的属性(即eppn),您需要做三件事:


导入他们的IdP元数据
导出您的SP元数据,并让您的大学身份人员将其导入
让您的大学身份团队向您发布eppn


请注意,这三个步骤可能是一个挑战,并且可能需要很短的时间和功课。

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

关于python - Django中的SAML/Shibb身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43765667/

相关文章:

python - 无法发送超过特定长度的 MPI 消息

python - 如何在创建 Django 夹具时填充继承的 MPTT 字段?

python - django rest 框架序列化程序和 django 表单

python - 在 Python 中查找小于或等于非循环有向图的给定值的最长路径

python - Qt 启动画面未在 python 中显示

python - Django 无法在 MySQL 中保存 unicode 字符串(操作错误 - 1366, "Incorrect string value")

node.js - 如何确保多个租户的 SAML 安全?

node.js - Shibboleth 和 Node.js 的响应程序错误

java - 当我从我的应用程序注销时如何从 Saml IDP 注销

python - Plotly 文本中的新行