You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:33:28