0

我正在尝试让OneLogin Saml身份验证在我的实时服务器上工作,并且正在运行时遇到与我的AWS负载平衡器设置有关的问题。我认为问题在于我有一个经典的负载均衡器,它使用AWS通配符HTTPS证书在端口80和443上侦听。负载均衡器将这两个端口转发到我的服务器上的端口80,并添加HTTP_X_FORWARDED_PROTO标头。Onelogin SAML与AWS负载平衡器

当我使用我的正常开发服务器(不是负载均衡器后面)SAML身份验证正常工作。我正在得到一个适当的回应。但是,当我推动生存时,SAML响应返回一个空的POST字典,而没有RELAY STATE。

任何想法为什么POST将是空的?

我的设置是:

  • 的Python与SAML连接器开发服务器上
  • 工作正常社会权威性
  • 当我用我的直播服务器在防火墙后面,响应空

我怀疑它与我的SSL证书有关,或者我的负载均衡器将443转发到端口80上的服务器并添加了标头。我试图通过分析转发的报头创建AUTH请求解决这个:

def _create_saml_auth(self, idp): 
    """Get an instance of OneLogin_Saml2_Auth""" 

    config = self.generate_saml_config(idp) 
    request_info = { 
     'https': 'on' if self.strategy.request_is_secure() else 'off', 
     'http_host': self.strategy.request_host(), 
     'script_name': self.strategy.request_path(), 
     'server_port': self.strategy.request_port(), 
     'get_data': self.strategy.request_get(), 
     'post_data': self.strategy.request_post(), 
    } 

    if 'HTTP_X_FORWARDED_PROTO' in self.strategy.request.META: 
     request_info['https'] = 'on' if self.strategy.request.META.get('HTTP_X_FORWARDED_PROTO') == 'https' else 'off' 
     request_info['server_port'] = self.strategy.request.META.get('HTTP_X_FORWARDED_PORT') 

但仍然无法返回从Onelogin SAML响应的empyy POST字典。尽管使用HTTPS正确生成初始url。

有没有人有类似的问题。我卡住了,很想让Onelogin工作。

非常感谢您的时间。

干杯,

菲尔

回答

0

您可以检查什么的错误。我使用这样的代码:

auth = OneLogin_Saml2_Auth(saml_req, saml_settings) 
    auth.process_response() 

    if not auth.is_authenticated(): 
     error = auth.get_last_error_reason() # here's the error message 

我猜你是碰到了同样的问题与ELB,我是,它就会像Authentication error: The response was received at http://... instead of https://...

该解决方案的东西要么执行https-> https重定向,或者让pysaml认为它在https上收到响应。以下是我做到了(在这种情况下,一个Django应用程序,但应该很容易修改为其他环境):

saml_req = { 
     'http_host': request.META['HTTP_HOST'], 
     'server_port': request.META['SERVER_PORT'], 
     'script_name': request.META['PATH_INFO'], 
     'get_data': request.GET.copy(), 
     'post_data': request.POST.copy() 
    } 

    if settings.SAML_FUDGE_HTTPS: # made a settings flag so it can be toggled 
     saml_req['https'] = True # this one forces https in the check url 
     saml_req['server_port'] = None # this one removes the port number (80) 

    auth = OneLogin_Saml2_Auth(saml_req, saml_settings) 
    auth.process_response() 

更新:为@smartin提到的评论 - 你也许能够嗅出HTTP_X_FORWARDED_FOR头和避免产生变种的设置

+1

评论这个线程: https://github.com/onelogin/python-saml/issues/75#issuecomment-108647017 – smartin