通过FastCGI将IIS的Windows身份验证上下文传递给Python
解决IIS + wfastcgi + Flask传递Windows身份验证用户信息的问题
我之前在类似环境里踩过同样的坑,结合你的场景(Windows/IIS10 + wfastcgi + Python3.6 + 域账户运行应用池),可以按以下步骤解决:
1. 配置IIS FastCGI的 impersonate 选项
和PHP的fastcgi.impersonate逻辑一致,wfastcgi需要开启这个设置来让FastCGI进程模拟访问用户的身份,同时把用户信息传递到Flask:
- 打开IIS管理器,找到FastCGI设置(在服务器或站点节点下)
- 找到你配置的Python3.6对应的条目,右键选择编辑
- 在环境变量区域,新增一个变量:
- 名称:
fastcgi.impersonate - 值:
1
- 名称:
- 保存设置后,重启对应的IIS应用池
2. 调整web.config配置
确保你的web.config里正确配置了wfastcgi和身份验证规则:
<?xml version="1.0" encoding="UTF-8"?> <configuration> <system.webServer> <handlers> <add name="Python FastCGI" path="*" verb="*" modules="FastCgiModule" scriptProcessor="C:\Python36\python.exe|C:\Python36\Lib\site-packages\wfastcgi.py" resourceType="Unspecified" requireAccess="Script" /> </handlers> <security> <authentication> <anonymousAuthentication enabled="false" /> <windowsAuthentication enabled="true" /> </authentication> </security> </system.webServer> <appSettings> <add key="WSGI_HANDLER" value="your_flask_app.app" /> <add key="PYTHONPATH" value="C:\path\to\your\flask\project" /> <!-- 确保开启身份信息传递 --> <add key="REMOTE_USER" value="true" /> </appSettings> </configuration>
注意:把your_flask_app.app替换成你实际的Flask应用入口(比如app.app,如果你的主文件是app.py),PYTHONPATH替换为你的Flask项目根目录。
3. 在Flask中获取用户信息
配置生效后,你可以通过Flask的request.environ直接拿到Windows身份验证的用户信息:
from flask import Flask, request app = Flask(__name__) @app.route('/') def index(): # 获取登录的域用户,格式一般是 DOMAIN\username remote_user = request.environ.get('REMOTE_USER') if remote_user: return f"当前登录用户:{remote_user}" else: return "未获取到用户身份信息" if __name__ == '__main__': app.run()
如果需要更详细的用户信息(比如用户组、全名等),可以在开启impersonate后,用pywin32调用Windows API获取:
import win32api import win32security from flask import Flask, request app = Flask(__name__) @app.route('/user-details') def user_details(): remote_user = request.environ.get('REMOTE_USER') if remote_user: # 模拟当前访问用户后获取详细信息 token = win32security.OpenThreadToken(win32api.GetCurrentThread(), win32security.TOKEN_QUERY, True) user_sid = win32security.GetTokenInformation(token, win32security.TokenUser)[0] return f"用户名:{remote_user}\n用户SID:{user_sid}" return "未获取到用户身份信息"
先安装pywin32:pip install pywin32
关键注意事项
- 确保应用池的身份是域账户,且该账户有访问Flask项目目录、执行Python脚本的权限
- 确认IIS站点仅启用Windows身份验证,完全禁用匿名身份验证
- 配置修改后一定要重启IIS和应用池,确保设置生效
内容的提问来源于stack exchange,提问作者Enno Richter
相关产品推荐
相关产品推荐

