使用 wfastcgi.py 从 Flask 应用读取 IIS 会话变量

Reading IIS Session Variables from Flask App with wfastcgi.py

我正在 IIS 7.0 上使用 Flask 0.12 构建安全应用程序。该网站位于子域中,因此其网址均以:

开头
https://<subdomain>.<domain>/<app_name>/

wfastcgi.py 去掉这些前缀,只将路由名称传递给我的 Flask 应用程序。所以上面的 URL 将作为路由 / 呈现给我的应用程序。还有其他 Web 应用程序(ASP.net 和 PHP)托管在同一个子域上,但具有不同的 app_name 常量。

由于我的用户在访问我的应用程序之前需要登录服务器,我想使用他们的 Windows 域唯一用户 ID 来管理应用程序中的逐页权限。在 ASP.NET 中,我可以使用 httpcontext 来做到这一点,但这在 Flask 中不可用。当我像这样转储会话内容时:

@app.route('/session_tester')
def session_test():
    return str(session)

我得到一个空白页面作为响应。

如何从 Flask 应用程序访问我的 IIS 会话变量?是否缺少配置变量?

当用户通过 IIS 验证时,他们的用户名出现在 REMOTE_USER 环境变量中。其他上下文信息也存储在不同的环境变量中。您可以配置哪些变量可供应用程序使用,但 REMOTE_USER 和其他一些变量应该默认存在。

因此,您应该可以通过 os.environ.get('REMOTE_USER').

获取登录用户
@app.route('/')
def index():
    username = os.environ.get('REMOTE_USER')
    template = "<h1>User: {{ username }}</h1>"
    return render_template_string(template, username=username)

如果您希望您的 Flask 会话知道用户会话,您需要让用户登录到 Flask 应用程序,而不是 IIS。或者,您可以使用一个中间件,根据 REMOTE_USER 环境变量将用户登录到您的 Flask 应用程序。例如,这应该可以使用 flask_login 扩展来实现。

编辑:

您还可以通过 request 代理对象访问环境变量。例如request.environ['REMOTE_USER']。另见 request.authorization