【问题标题】:web app apparently mixing up authentication credentials网络应用程序显然混淆了身份验证凭据
【发布时间】:2016-04-13 03:47:35
【问题描述】:

我构建了这个内部 Web 应用程序(基于 Flask 构建并与 Gunicorn 一起使用),多年来它从未存储任何类型的用户数据或会话数据,并且运行良好。现在我添加了一个身份验证页面,使用我的组织的 LDAP - 用户输入用户名和密码(他们用来登录他们的机器),应用程序验证 LDAP 服务器上的凭据,如果一切匹配,则让用户通过。

当我只使用一个进程 (gunicorn -w 1) 为应用程序提供服务时,它可以正常工作。但是当我使用多个进程为应用程序提供服务时,我会出现不稳定的行为!有时即使用户名和密码正确,身份验证也会失败。有时,如果一个用户进行了身份验证,那么其他用户将被视为经过身份验证。有时用户进行身份验证并开始使用应用程序一段时间,然后单击某些内容并重定向到登录页面(所有功能都经过修饰以检查用户是否已通过身份验证)。

我的猜测是我未能正确隔离用户 - 用户 X 输入了正确的用户名和密码,但是当点击“提交”时,应用程序认为用户 Y 没有经过身份验证,因此拒绝访问(这里是认证逻辑:我检查flask.session是否有密钥user;如果有,用户通过;如果没有,用户被重定向到登录页面,如果认证成功,我将用户名存储在flask.session["user"] )。

我该如何调试呢?如果我的猜测是正确的,那么如何确保用户的凭据不会混淆?

【问题讨论】:

  • 您提到它适用于一个进程,并且“有时即使用户名和密码正确,身份验证也会失败”。不同的进程是否肯定连接到同一个数据库?
  • 您是否可以在全局对象上设置会话信息?如果你在本地运行,如果你用一个用户登录,然后切换浏览器会发生什么?您仍然通过身份验证吗?
  • 我将会话信息存储在 Flask 的 session 对象中。如果我切换浏览器,行为就会不稳定,就像使用同一个浏览器一样。
  • 我刚刚注意到sessions 没有持续存在(它显然无缘无故地变空了)。所以,我用谷歌搜索了“flask session gunicorn”,找到了这个answer,并将我的app.secret_key 固定(而不是随机) - 现在session 似乎持续存在并且事情似乎正在工作。但现在说还为时过早,我需要对其进行更多测试(我会在这里报告)。

标签: python authentication flask gunicorn


【解决方案1】:

我注意到session 对象没有持续存在(它一直为空,没有明显的原因)。我搜索了一下,发现了这个answer。原来我的应用程序的密钥不应该是随机的(它是os.urandom(24)),它应该是一个常量字符串。一旦我修复了身份验证工作正常。

【讨论】:

    猜你喜欢
    • 2022-08-13
    • 2023-04-03
    • 2018-06-04
    • 1970-01-01
    • 2015-01-19
    • 2011-08-15
    • 2017-04-23
    • 2023-03-16
    • 2020-12-11
    相关资源
    最近更新 更多