IIS通过HTTP Platform Handler部署Django时未传递REMOTE_USER
解决IIS部署Django时Windows身份验证用户信息无法传递的问题
以下是需要检查和调整的关键配置项:
1. 开启HTTP Platform Handler的身份令牌转发
IIS的HTTP Platform Handler默认不会转发Windows身份验证令牌,必须手动配置:
- 打开站点根目录的
web.config,找到<httpPlatform>节点,添加forwardWindowsAuthToken="true"参数,示例配置:<httpPlatform processPath="C:\Python39\python.exe" arguments="manage.py runserver %HTTP_PLATFORM_PORT%" stdoutLogEnabled="true" stdoutLogFile=".\logs\stdout" forwardWindowsAuthToken="true" /> - 保存配置后重启IIS站点,这是REMOTE_USER能传递到Django的核心前提。
2. 强制传递REMOTE_USER环境变量
在web.config的<httpPlatform>节点内添加环境变量映射,确保IIS的REMOTE_USER被传递给Django进程:
<httpPlatform ...> <environmentVariables> <environmentVariable name="REMOTE_USER" value="%REMOTE_USER%" /> </environmentVariables> </httpPlatform>
3. 调整Django中间件与认证后端顺序
RemoteUserMiddleware的位置直接影响生效与否:
- 修改
settings.py中的MIDDLEWARE列表,将RemoteUserMiddleware放在AuthenticationMiddleware之前:MIDDLEWARE = [ # 其他中间件(如SecurityMiddleware等) 'django.contrib.auth.middleware.RemoteUserMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', # 其他后续中间件 ] - 同时在
AUTHENTICATION_BACKENDS中添加远程用户认证后端:AUTHENTICATION_BACKENDS = [ 'django.contrib.auth.backends.RemoteUserBackend', 'django.contrib.auth.backends.ModelBackend', # 保留默认后端可选 ]
4. 检查IIS站点身份验证规则
- 确保站点的「身份验证」设置中仅启用Windows身份验证,禁用匿名身份验证(若同时启用匿名,IIS会优先走匿名流程,导致REMOTE_USER不传递)。
- 进入站点「授权规则」,设置为「允许所有经过身份验证的用户」,避免权限拦截导致用户信息无法流转。
5. 验证传递状态
可以临时添加测试视图,打印request.META和环境变量,确认REMOTE_USER是否存在:
import os from django.http import HttpResponse def test_auth(request): meta_content = "\n".join([f"{k}: {v}" for k, v in request.META.items()]) env_content = "\n".join([f"{k}: {v}" for k, v in os.environ.items()]) return HttpResponse(f"Request META:\n{meta_content}\n\n环境变量:\n{env_content}")
访问该视图,若仍无REMOTE_USER,需重新检查web.config的HTTP Platform Handler配置是否生效。
内容的提问来源于stack exchange,提问作者Oliver Graf
相关产品推荐
相关产品推荐

