【问题标题】:Reading IIS Session Variables from Flask App with wfastcgi.py使用 wfastcgi.py 从 Flask 应用程序中读取 IIS 会话变量
【发布时间】:2018-04-13 20:37:05
【问题描述】:

我正在 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 会话变量?是否有我缺少的配置变量?

【问题讨论】:

    标签: python flask session iis iis-7


    【解决方案1】:

    当用户通过 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

    【讨论】:

    • 这不起作用。我转储了 os.environ 的全部内容,但没有“REMOTE-USER”。
    • 我做了一些进一步的研究。事实证明,'REMOTE-USER' 没有存储在 os.environ 中,但作为 WSGI 规范的一部分,它在初始化时被传递给我的 Flask 对象。我可以使用语句 request.environ['REMOTE-USER'] 访问它。如果您可以编辑您的回复以包含此内容,我会将其标记为已接受。
    • 你确定吗?请注意,它是一个下划线,而不是破折号。即REMOTE_USER 不是REMOTE-USER。它可能适用于request.environ,因为 Werkzeug 使键对大小写和破折号/下划线不敏感,IIRC。让我知道。无论如何我都会编辑答案。
    猜你喜欢
    • 2012-08-03
    • 1970-01-01
    • 2015-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-19
    • 1970-01-01
    • 2011-08-20
    相关资源
    最近更新 更多