Mat*_*obs 6 authentication reverse-proxy apache-2.2
我有 Apache 作为内部服务器的反向代理运行。访问代理的用户需要使用客户端证书。在内部服务器上,有一个 Web 应用程序可以使用 HTTP 标头对用户进行身份验证。我想让代理根据客户端证书提供该标头。
标头值是用户的 id。理想情况下,我会有一个将用户 ID 映射到证书的文本文件。据我所知,我只需要RewriteMap标题。
# Somehow lookup USERID given SSL_CLIENT_S_DN
RequestHeader set X-User-ID %{USERID}
Run Code Online (Sandbox Code Playgroud)
我想避免一大堆SetEnvIf需要重新启动服务器才能更改的s,例如:
SetEnvIf SSL_CLIENT_S_DN [User 1's SSL_CLIENT_S_DN] USERID=12
SetEnvIf SSL_CLIENT_S_DN [User 2's SSL_CLIENT_S_DN] USERID=34
SetEnvIf SSL_CLIENT_S_DN [User 3's SSL_CLIENT_S_DN] USERID=56
...
Run Code Online (Sandbox Code Playgroud)
有什么好方法可以避免用户基本上需要进行两次身份验证?
我想我明白你的需要,但如果我错了,请纠正我。这需要一个三阶段的方法。
您使用 aRewriteCond和 aRewriteMap将 映射SSL_CLIENT_S_DN到 a USERID, aRewriteRule设置环境变量,然后使用RequestHeader指令根据环境变量设置标头。这应该会导致标头正常传递到内部服务器。
就像是:
RewriteEngine On
# Define a RewriteMap for DN to user id
RewriteMap dntouserid "txt:/path/to/dntouserid.txt"
# Test if we have something in the map for a the current DN
RewriteCond ${dntouserid:%{SSL:SSL_CLIENT_S_DN}} (.+)
# Set environment variable based on that mapping. %1 comes from the RewriteCond
RewriteRule ^ - [E=MYUSER:%1]
# Set header to that environment variable
RequestHeader set X-User-ID %{MYUSER}e
Run Code Online (Sandbox Code Playgroud)
然后你的地图包含如下行:
DN_OF_USER1 12
DN_OF_USER2 34
DN_OF_USER3 56
Run Code Online (Sandbox Code Playgroud)
如果 DN 包含空格,您将必须使用外部程序来执行地图而不是纯文本文件(它可能适用于其他地图类型,但我自己没有尝试过)。
| 归档时间: |
|
| 查看次数: |
1164 次 |
| 最近记录: |