2016-09-29 104 views
1

我在我的网站上实施SAML支持。我在我的Django应用程序中使用OneLogin's Python SAML Toolkit来执行此操作。当它与本地计算机http://127.0.0.1:8000(完全本地)或http://192.168.x.x:800(本地网络)配合使用时,一切都可以正常连接到OneLogin测试应用程序和Azure应用程序。只要我在登台服务器上尝试这个操作,强制所有URL都为https,事情就会失败。 IE11无法在所有的帖子在身份提供者的反应,这是不可思议的任何数据,一般我得到的错误从工具包像这样:SAML和强制SSL

The response was received at https://dev.mysite.com:80/saml/connect/ instead of https://dev.mysite.com/saml/connect/ 

所以当事情应适当配置中,IDP卷起努力POST回到端口80上的登台服务器,这会混淆事物。如果我将它全部设置为从头开始使用端口80,则Chrome会因为它不信任https://...:80作为安全措施而大吃一惊。我无法找到任何涉及此问题的文档或SO问题;我所看到的全部是the OneLogin Python setup instructions中的这个注释:

Important: Ensure that your URLs begin with http, not https. 

但是没有关于WHY的解释。我完全困惑。

回答

0

python-saml支持https或http。

所有你需要的是集合的请求propertly值,看看这个演示与prepare_django_request方法 (https://github.com/onelogin/python-saml/blob/master/demo-django/demo/views.py#L18

+0

我设置这些值是否正常;这不是问题。看来,IdP始终使用http发回,而我的开发人员会将其强制升级到https,这会将事情搞砸。我会尽力提供更多细节。 – grantpatterson

+0

好吧,我会承认,该演示的_close reading_固定了我们的问题: '#如果服务器在代理或平衡器后面使用HTTP_X_FORWARDED字段' 基本上我们需要使用'request.META ['HTTP_X_FORWARDED_PORT']'因为我们在ELB后面。 (在Django 1.9中的'get_port()'对此会很有用。)这就是80端口来自混淆事物的地方。 – grantpatterson