Django SAML integration



我正在使用Django 1.9,Python 3,在Docker本地运行(用于测试(
尝试将django-saml2-auth集成到我的应用程序中。
几乎遵循了文档中的所有步骤:
1(所有安装都成功
2(新URL被导入到其余
URL之上3(已安装的应用程序包括'django_saml2_auth'
4('SAML2_AUTH'字典被放置在设置中(并且所有属性都被映射(
5(在SAML2身份提供程序(使用OneLogin(中,单点登录URL和受众URI(SP实体ID(设置为 http://127.0.0.1:8000/saml2_auth/acs/

发生的情况是,当我到达 http://127.0.0.1:8000/admin 浏览器进入无限重定向循环时:

...
[02/May/2018 15:43:06] "GET /admin/ HTTP/1.1" 302 0
[02/May/2018 15:43:06] "GET /admin/login/?next=/admin/ HTTP/1.1" 302 0
[02/May/2018 15:43:07] "POST /saml2_auth/acs/ HTTP/1.1" 302 0
[02/May/2018 15:43:07] "GET /admin/ HTTP/1.1" 302 0
[02/May/2018 15:43:07] "GET /admin/login/?next=/admin/ HTTP/1.1" 302 0
[02/May/2018 15:43:08] "POST /saml2_auth/acs/ HTTP/1.1" 302 0
[02/May/2018 15:43:08] "GET /admin/ HTTP/1.1" 302 0
...
  • 当我禁用django-saml2-auth时,我看到创建了一个员工用户。
  • OneLogin界面中,我可以看到我已成功登录。

  • 覆盖django_saml2_auth.views.signin(r),其中rdjango.core.handlers.wsgi.WSGIRequest,用于<WSGIRequest: GET '/admin/login/?next=/admin/'>,并且在请求中,user设置为AnonymousUserCOOKIES包含sessionidcsrftoken

我希望为创建/获取的用户启动会话,并且我将进入/admin/<whatever>页面。

我将不胜感激在调试方面的任何帮助,谢谢!

编辑:我能够通过从settings.py中删除AUTHENTICATION_BACKENDS来使其工作 - 我还有其他 3 个我使用的后端。似乎他们与django-saml2-auth冲突.
有没有办法让django-saml2-auth与其他后端一起工作?

编辑2:将尝试集成django-saml2-pro-auth,它有一个后端,所以不会冲突。不过,我真的很感激一些见解。

编辑3:回到编辑 2,当我删除所有后端并且它们不冲突时,日志流如下所示:

[04/May/2018 15:24:26] "GET /admin/ HTTP/1.1" 302 0
[04/May/2018 15:24:27] "GET /admin/login/?next=/admin/ HTTP/1.1" 302
[04/May/2018 15:26:27] "POST /saml2_auth/acs/ HTTP/1.1" 302 0
[04/May/2018 15:26:27] "GET /admin/ HTTP/1.1" 200 38398

最后一个GET没有被重定向的地方,有 200。

问题已解决: 深入研究后 - 似乎这段代码是问题所在:django_saml2_auth/views.py, acs()

if target_user.is_active:
target_user.backend = 'django.contrib.auth.backends.ModelBackend'
login(r, target_user)
else:
return HttpResponseRedirect(get_reverse([denied, 'denied', 'django_saml2_auth:denied']))

似乎默认的模型后端是必要的。 当使用其他后端时,Django 不再使用默认值,因此无限循环。 如果将默认后端添加到后端列表中,则一切将按预期工作。

最新更新