我正在使用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)
,其中r
是django.core.handlers.wsgi.WSGIRequest
,用于<WSGIRequest: GET '/admin/login/?next=/admin/'>
,并且在请求中,user
设置为AnonymousUser
,COOKIES
包含sessionid
和csrftoken
。
我希望为创建/获取的用户启动会话,并且我将进入/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 不再使用默认值,因此无限循环。 如果将默认后端添加到后端列表中,则一切将按预期工作。