如何配置NGINX获取已认证用户的remote_user变量
解决NGINX获取IIS已认证Windows用户名的问题
首先得明确:你的NGINX实例本身并没有处理用户认证,所以$remote_user变量自然是空的——这个变量只有当NGINX自身完成了身份验证(比如basic auth、LDAP auth)时才会被填充。而你的认证是在前端IIS企业门户完成的,所以核心思路是让IIS把已认证的用户名传递给NGINX,再由NGINX转发给后端Flask应用。
以下是具体的配置步骤:
1. 配置IIS传递Windows用户名到NGINX
因为IIS是前端反向代理,它需要将认证后的用户信息注入到请求头中发送给NGINX:
- 打开IIS管理器,找到你的企业门户站点,进入URL重写模块
- 创建或编辑现有的反向代理规则,切换到服务器变量选项卡
- 添加一个新的服务器变量,名称设为
HTTP_X_REMOTE_USER,值设置为{REMOTE_USER}(这个IIS变量存储了已认证的Windows用户名) - 确保该变量被允许在请求中传递(点击"允许"按钮添加到允许列表)
这样IIS会在转发请求到NGINX时,带上X-Remote-User请求头,值就是用户的Windows账户名。
2. 修改NGINX配置接收并转发用户名
更新你的NGINX站点配置,从IIS传递的请求头中提取用户名,然后转发给后端Flask:
server { # Docker DNS resolver 127.0.0.11; location / { # 从IIS发送的X-Remote-User头中获取用户名,赋值给$remote_user变量 set $remote_user $http_x_remote_user; # Prevent resolution on start set $docker_host "app"; proxy_pass http://$docker_host:8999; proxy_pass_request_headers on; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 将用户名转发给后端Flask,可以用Remote-User或自定义头 proxy_set_header Remote-User $remote_user; proxy_set_header X-Remote-User $remote_user; } listen 80; server_name app.companyDomain.net; }
关键说明:
- 如果IIS传递的是
Remote-User而不是X-Remote-User,就把$http_x_remote_user改成$http_remote_user - 添加
proxy_set_header是为了让后端Flask能直接通过请求头拿到用户名
3. 在Flask应用中获取用户名
在你的Flask代码中,通过请求头即可获取用户名:
from flask import Flask, request app = Flask(__name__) @app.route('/index', methods=['POST']) def index(): # 从请求头获取用户名,根据你NGINX设置的头名称选择 username = request.headers.get('Remote-User') or request.headers.get('X-Remote-User') # 接下来用这个用户名做数据库查询即可 return f"Authenticated user: {username}"
额外注意事项
- 为了安全,建议在IIS和NGINX之间使用HTTPS通信,避免请求头被篡改
- 确保IIS的Windows身份认证已经正确启用,并且企业门户的访问必须经过认证(禁用匿名访问)
内容的提问来源于stack exchange,提问作者jugo
相关产品推荐
相关产品推荐

