反向代理后面的非标准端口上的 SAML2 服务提供商
SAML2 Service Provider on non standard port behind a reverse proxy
我有一个 SAML2 服务提供商(Open edX Platform if it makes a difference), configured according to docs and otherwise working normally. It runs at http://lms.local:8000 and works just fine with TestShib 测试身份提供商和其他第 3 方提供商。
引入nginx反向代理后问题就开始了。设置如下:
- nginx,显然,运行s 在端口 80
- LMS(服务提供商)运行端口 8000
lms.local
通过主机文件 别名为 localhost
Nginx 具有以下站点配置:
server {
listen 80;
server_name lms.local;
location / {
proxy_pass http://localhost:8000;
proxy_set_header Host $host;
if ($request_method = 'OPTIONS') {
return 204;
}
}
}
问题如下:python-social-auth 检测到 lms.local:8000
上的服务器 运行(通过 request.META['HTTP_PORT']
)。因此,如果尝试通过 nginx 代理使用 SAML SSO,则会失败并显示以下消息:
Authentication failed: SAML login failed: ['invalid_response'] (The response was received at http://lms.local:8000/auth/complete/tpa-saml/ instead of http://lms.local/auth/complete/tpa-saml/)
如果有帮助,会在 python-saml.OneLogin_Saml2_Response.is_valid 中抛出导致此消息的异常。
问题是:是否有可能 运行 SP 在同一域的反向代理后面,但在不同的端口? Shibboleth wiki 说它是 totally possible 到 运行 不同域上反向代理背后的 SP,但对端口只字未提。
在这种特殊情况下,反向代理发送 X-Forwarded-Host
和 X-Forwarded-Port
headers,所以我只是修改了 Django 策略以使用这些值而不是 Django 提供的值(即 request.get_host
和 request.META['SERVER_PORT']
),这产生了两个拉取请求:
我有一个 SAML2 服务提供商(Open edX Platform if it makes a difference), configured according to docs and otherwise working normally. It runs at http://lms.local:8000 and works just fine with TestShib 测试身份提供商和其他第 3 方提供商。
引入nginx反向代理后问题就开始了。设置如下:
- nginx,显然,运行s 在端口 80
- LMS(服务提供商)运行端口 8000
lms.local
通过主机文件 别名为 localhost
Nginx 具有以下站点配置:
server {
listen 80;
server_name lms.local;
location / {
proxy_pass http://localhost:8000;
proxy_set_header Host $host;
if ($request_method = 'OPTIONS') {
return 204;
}
}
}
问题如下:python-social-auth 检测到 lms.local:8000
上的服务器 运行(通过 request.META['HTTP_PORT']
)。因此,如果尝试通过 nginx 代理使用 SAML SSO,则会失败并显示以下消息:
Authentication failed: SAML login failed: ['invalid_response'] (The response was received at http://lms.local:8000/auth/complete/tpa-saml/ instead of http://lms.local/auth/complete/tpa-saml/)
如果有帮助,会在 python-saml.OneLogin_Saml2_Response.is_valid 中抛出导致此消息的异常。
问题是:是否有可能 运行 SP 在同一域的反向代理后面,但在不同的端口? Shibboleth wiki 说它是 totally possible 到 运行 不同域上反向代理背后的 SP,但对端口只字未提。
在这种特殊情况下,反向代理发送 X-Forwarded-Host
和 X-Forwarded-Port
headers,所以我只是修改了 Django 策略以使用这些值而不是 Django 提供的值(即 request.get_host
和 request.META['SERVER_PORT']
),这产生了两个拉取请求: