代码之家  ›  专栏  ›  技术社区  ›  DOK

如何支持使用哈希或加密密码的web应用程序?

  •  8
  • DOK  · 技术社区  · 17 年前

    在企业环境中支持新的web应用程序时,通常需要以特定用户的身份登录,以便诊断他们遇到的实际或感知到的问题。这里有两个相反的问题:

    1. 最佳实践是使用 散列或加密密码 ,不是明文。有时,中间有一个第三方SSO(单一登录)。无法检索用户的密码。除非用户提供(不鼓励),否则无法以该用户身份登录。

    2. 许多网络应用程序都有 个性化和复杂授权 不同的用户具有不同的角色(管理员、经理、用户)和不同的权限。有时用户只能看到他们的数据——他们的客户或任务。一些用户具有只读访问权限,而另一些用户可以编辑。因此,每个用户对web应用程序的看法都是独一无二的。

    假设在企业环境中,去用户的办公桌或直接连接到他们的机器是不可行的。

    你如何处理这种情况?

    编辑:我想重申,在一家拥有数十万员工的大型金融机构或典型的财富500强公司,无论是在全国还是世界各地,仅仅是某个it部门的开发人员都不可能直接访问用户的机器。其中一些是客户使用的面向公众的网络应用程序(如网上银行和股票交易)。而且,其中许多是依赖于Active Directory或SSO的内联网应用程序,这意味着许多应用程序的用户凭据是相同的。我非常感谢大家的建议;有些在其他类型的环境中可能非常有用。

    7 回复  |  直到 12 年前
        1
  •  19
  •   Ned Batchelder    17 年前

    其中一些想法给用户带来了不便,要么强迫他们更改密码,要么占用他们的桌面进行调试。

    Markc的想法是最好的:通过提供用户名和超级用户凭据,而不是用户的凭据,来增强您的身份验证逻辑,允许超级用户以特定用户的身份登录。

    我过去是这样做的(伪python):

    if is_user_authenticated(username, userpassword):
        login the user
    else if ':' in userpassword:
        supername, superpassword = userpassword.split(':')
        if is_superuser_authenticated(supername, superpassword):
            login the user
    

    换言之,如果用户名和密码没有通过身份验证,如果密码有冒号,那么它实际上是由冒号连接的管理员用户名和管理员密码,因此如果它们是正确的管理用户名和密码,请以用户名登录。

    这意味着您可以以用户身份登录,而不知道他们的秘密,也不会给他们带来不便。

        2
  •  5
  •   Noah Goodrich    17 年前

    对于我们的web应用程序,我们使用一个过程,由于缺乏更好的术语,该过程被定义为“劫持”用户的帐户。

    基本上,管理员只需点击一个按钮就可以“劫持”用户的帐户。在代码中,您只需使用一个唯一标识符(用户id在不太安全的环境中工作),然后在会话中建立必要的凭据,以便它们可以在该用户的配置文件中工作。为了获得更安全的环境,您可以为每个用户使用唯一的哈希值。

    为了确保这种劫持方法是安全的,它总是首先验证请求是由具有适当权限的经过身份验证的管理员发出的。因此,有必要劫持管理员的会话或捕获他们的身份验证凭据,以便有人利用应用程序中的劫持功能。

        3
  •  2
  •   Markc    17 年前

    我有四个想法。在我打字的时候,其中3个已经被推荐了(所以我投了赞成票)

    想法3的变体-模仿:

    为了使其与正常登录“尽可能相同”,只需进行最少的代码更改,您可以通过提供管理员凭据和备用用户名(例如以管理员:用户、管理员密码登录)来添加在登录时直接模拟的能力。系统会将此视为使用userpassword以用户身份登录。

    想法4:你能访问密码存储吗?如果是这样,请暂时用已知密码的哈希值替换用户的哈希值。(密码通常在线存储在数据库中。SQL查询工具可以进行交换)

        4
  •  1
  •   Matt Brunell    17 年前

    管理员应该能够更改用户的密码。将用户的密码更改为您知道的密码。然后,您可以以该用户身份登录。

    在您完成调试后,告诉用户重置他/她的密码。

        5
  •  1
  •   fwzgekg    17 年前

    通常通过某种远程控制软件,可以用来查看他们的桌面。如果它们位于Windows终端服务器上,则可以使用内置的管理工具。否则,我会在内部网络上使用VNC之类的东西,或者使用LogMeIn之类的外部服务( http://www.logmein.com/ ).

        6
  •  0
  •   dove    17 年前
    1. 您是否可以拥有一个测试环境,其中定期复制实时数据(显然经过消毒以满足任何安全或数据保护问题)。如果允许的话,可以使用与有问题的用户设置相似的用户进行故障排除,或者甚至可以使用与该用户相同的用户。

    2. 使用其他答案中提到的远程桌面客户端,但这对你来说可能不切实际。如果您在域内拥有这些权限,我听说过错误处理,甚至可以进行屏幕抓取并将其包含在日志中!但这听起来有点奇怪。

    3. 你能有一个管理工具将用户克隆到演示帐户中吗?

        7
  •  0
  •   Les Hill Les Hill    17 年前

    我们在web应用程序中使用的解决方案是让authN/authZ返回所需的用户作为有效用户。我们通过一个管理员功能来设置伪装,然后当我们询问当前登录的用户(current_user)时,我们处理伪装:

      def current_user_with_effective_user
        if masked?
          current_user_without_effective_user.masquerade_as
        else
          current_user_without_effective_user
        end
      end
      alias_method_chain, :current_user, :effective_user
    
    推荐文章