在工作中,我们遇到了一个问题,即当用户访问通过 Apache2 管理的 URL 时,我们希望根据他们是否是特定 LDAP 组的成员来重定向用户。
有以下三种情况:
- 用户提供有效的凭据和 LDAP 组的 IS 成员 => 重定向到应用程序 ABC(有效)
- 用户提供了有效的凭据,但不是 LDAP 组的成员 => 重定向到 Maintenance-Page(不起作用,这是问题所在)
- 用户提供无效信用或点击取消 => 重定向到维护(工作)
我们的问题是:如果用户有效且不是 LDAP 组“THE-GROUP”的成员,我们如何重定向用户?
现在,除非您单击取消或“THE-GROUP”的成员,否则输入凭据的覆盖层会无限显示。
我们的应用程序 ABC 托管在我们的场所,在 Ubuntu 上运行。我们的反向代理是在 Ubuntu 16.04 上运行的 Apache 2.4.18-2ubuntu3.10。客户将使用来自世界各地的各种浏览器和操作系统,因此按 IP 过滤不是一种选择。反向代理位于我们的 DMZ 中,而 App-Server 位于外部。创建了 NAT 规则,以便两个系统都可以通过 8080(运行 ABC 的端口)进行通信。
我们的(测试)配置如下所示:
<VirtualHost *:443>
ServerName testabc.company.com
SSLProxyEngine On
SSLEngine On
SSLCertificateKeyFile /etc/ssl/private/our_company.key
SSLCertificateFile /etc/ssl/certs/company_com/fullchain.cer
ErrorLog ${APACHE_LOG_DIR}/LDAP_test_error.log
CustomLog ${APACHE_LOG_DIR}/LDAP_test_access.log combined
# error document shown to unauthorized users
DocumentRoot /var/www/Maintenance_Page
ErrorDocument 401 /TTT/index.html
<Location />
ProxyPass http://internal-vm-name:8080/
ProxyPassReverse http://internal-vm-name:8080/
</Location>
# the following block applies to all proxied content
<Proxy "*">
AuthType Basic
AuthBasicProvider ldap
AuthUserFile /dev/null
AuthName "Auth with our LDAP Server"
# configuration of the mod_authnz_ldap module
AuthLDAPURL "ldap://SOMETHING"
AuthLDAPBindDN "FOO,BAR "
AuthLDAPBindPassword "FOOBAR"
# Only users belonging to group THE-GROUP can access ABC,
# all others will see the error document specified above.
Require ldap-group CN=THE-GROUP,OU=Company,DC=ad,DC=Company,DC=com
</Proxy>
</VirtualHost>
# virtual host required to access images and style-sheets from the error document
<VirtualHost *:80>
ServerName maintenance.company.com
DocumentRoot /var/www/Maintenance_Page
ErrorLog ${APACHE_LOG_DIR}/maintenance -error.log
CustomLog ${APACHE_LOG_DIR}/maintenance.log combined
</VirtualHost>
# redirection from HTTP to HTTPS
<VirtualHost *:80>
ServerName abc.company.com
Redirect Permanent / https://abc.company.com/
Redirect / https://abc.company.com/
</VirtualHost>
您的问题没有好的解决方案。您正在使用 HTTP Basic Auth,这意味着浏览器正在尝试打开页面,正在获取 401 状态并发送 WWW-Authenticate: Basic realm="Whatever" 标头。
此时浏览器显示身份验证对话框,一旦输入用户名和密码,它们就会发送到 Authorization 标头内的网络服务器。
如果服务器拒绝请求,它将再次发送带有 WWW-Authenticate 标头的 401 状态。浏览器将无限次地弹出对话框。服务器在任何时候都不能说密码被永久拒绝。
如果您使用的是 mod_dbd 支持的数据库,则可以使用 mod_rewrite 为组执行 SQL 查询并相应地重定向。我不相信 LDAP Auth 处理程序可以做到这一点。