在企业环境中支持新的Web应用程序时,通常需要以特定用户身份登录,以便诊断他们遇到的真实或感知问题。这里有两个相反的问题:
最佳做法是使用散列或加密密码,而不是明文。有时,中间会有第三方SSO(单点登录)。无法检索用户的密码。除非用户提供(不鼓励),否则无法以该用户身份登录。
许多网络应用都有个性化和复杂授权。不同的用户具有不同的角色(管理员,经理,用户),具有不同的权限。有时用户只能看到他们的数据 - 他们的客户或任务。某些用户具有只读访问权限,而其他用户可以进行编辑。因此,每个用户对Web应用程序的看法都是独一无二的。
假设在企业环境中,无法访问用户的桌面或直接连接到他们的计算机。
你如何处理这种情况?
编辑:我想重申,在一个大型金融机构或典型的财富500强企业中,全国各地和全世界都有数十万名员工,某些IT部门的开发人员不可能成为能够直接访问用户的机器。其中一些是客户使用的面向公众的网络应用程序(如网上银行和股票交易)。而且,其中许多都是依赖于Active Directory或SSO的Intranet应用程序,这意味着许多应用程序的用户凭据都是相同的。我非常感谢你们的建议;有些可能在其他类型的环境中非常有用。
答案 0 :(得分:19)
许多这些想法会给用户带来不便,无论是强迫他们更改密码,还是占用他们的桌面进行调试。
Markc的想法是最好的:增加您的身份验证逻辑,允许超级用户以特定用户身份登录,方法不是提供用户的凭据,而是提供用户名和他们的超级用户凭据。
我过去就这样做了(伪ish 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
换句话说,如果用户名和密码没有进行身份验证,如果密码有冒号,那么它实际上是冒号用户名和管理员密码,如果他们是正确的管理员用户名,请登录为用户名和密码。
这意味着您可以在不知道其秘密的情况下以用户身份登录,并且不会给他们带来任何不便。
答案 1 :(得分:5)
对于我们的网络应用程序,我们使用一个过程,缺少更好的术语被定义为“劫持”用户的帐户。
基本上,管理员可以通过简单的按钮点击“劫持”用户的帐户。在代码中,您只需使用唯一标识符(用户ID在较不安全的环境中工作),然后在会话中建立必要的凭据,以便它们可以在该用户的配置文件中工作。对于更安全的环境,您可以为每个用户使用唯一的哈希值。
为了确保此劫持方法的安全性,它始终首先验证请求是否由具有适当权限的经过身份验证的管理员进行。因此,有必要劫持管理员的会话或捕获其身份验证凭据,以便某人可以利用应用程序中的劫持功能。
答案 2 :(得分:2)
我有4个想法。当我输入时,其中有3个已被建议(所以我对它们进行了投票)
关于想法3的变体 - 冒充:
要使用最少的代码更改使其与正常登录“尽可能相同”,您可以添加通过提供管理员凭据和备用用户名直接在登录时模拟的功能,例如:以管理员身份登录:user,adminpassword。系统会将此视为与使用userpassword的用户一起登录。
创意4:您可以访问密码存储区吗?如果是这样,请暂时使用已知密码的哈希值替换用户的哈希值。 (密码通常在线存储在数据库中.SQL查询工具可以进行交换)
答案 3 :(得分:1)
管理员应该能够更改用户的密码。将用户的密码更改为您知道的密码。然后,您可以以该用户身份登录。
完成调试后,告诉用户重置密码。
答案 4 :(得分:1)
通常通过某种可用于查看桌面的远程控制软件。如果它们位于Windows终端服务器上,则可以使用内置管理工具。否则,我会在内部网络或LogMeIn(http://www.logmein.com/)之类的外部服务中使用类似VNC的东西。
答案 5 :(得分:0)
您是否可以拥有一个测试环境,其中会定期删除实时数据(显然需要进行清理以满足任何安全或数据保护问题)。如果允许,用户在设置上与遇到问题的用户类似,可以用来排除故障,或者确实是用户。
使用其他答案中提到的远程桌面客户端,但这对您来说可能并不实用。如果您在域中拥有这些权限,我甚至会听到错误处理,甚至在日志中进行屏幕抓取!但这对我来说听起来有些奇怪。
您是否可以使用管理工具将用户克隆到模拟帐户?
答案 6 :(得分:0)
我们在网络应用中使用的解决方案是让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