Django SAML 集成
Django SAML integration
我在 Docker 本地使用 Django 1.9,Python 3,运行(用于测试)
尝试将 django-saml2-auth 集成到我的应用程序中。
几乎遵循文档中的所有步骤:
1) 所有安装都成功
2) 新 URL 的导入高于其余
3) 安装的应用程序包括 'django_saml2_auth'
4) 'SAML2_AUTH'
dict 被放置在设置中(所有属性都被映射)
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
。
我希望会话将为 created/fetched 的用户启动,并且我将进入 /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']))
似乎需要默认的 ModelBackend。
当使用其他后端时,Django 不再使用默认值,因此无限循环。
如果将默认后端添加到后端列表,一切都会按预期工作。
我在 Docker 本地使用 Django 1.9,Python 3,运行(用于测试)
尝试将 django-saml2-auth 集成到我的应用程序中。
几乎遵循文档中的所有步骤:
1) 所有安装都成功
2) 新 URL 的导入高于其余
3) 安装的应用程序包括 'django_saml2_auth'
4) 'SAML2_AUTH'
dict 被放置在设置中(所有属性都被映射)
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
。
我希望会话将为 created/fetched 的用户启动,并且我将进入 /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']))
似乎需要默认的 ModelBackend。 当使用其他后端时,Django 不再使用默认值,因此无限循环。 如果将默认后端添加到后端列表,一切都会按预期工作。