1

我正在尝试为 ASP.NET 应用程序实现“充当”功能,同时使用 Windows 身份验证和自定义角色提供程序。基本上我想做的是:

  • 使用 Windows Auth 获取当前用户的域帐户以验证他们是已批准的域用户
  • 使用自定义角色提供程序从 SQL Server 数据库获取权限信息。
  • 实现功能以允许应用程序的管理员能够“充当”另一个用户,而无需他们以该用户的身份实际登录应用程序。

我试图实现的场景是应用程序管理员试图帮助用户解决问题并单击“充当”按钮以充当该用户并以他们看到的方式查看应用程序。因此,角色提供者需要了解当前用户正在充当其他人,并获取该用户而不是当前用户的权限信息。

我的计划是实现一个模拟功能,该功能将删除角色 cookie 并向会话变量添加一个值,指示用户当前正在模拟另一个用户。但是,由于在授权发生时未填充会话,因此这是不可能的。我不想使用 cookie,因为我不希望这会导致管理员机器上的潜在持久状态(这样管理员无法打开应用程序的另一个窗口并充当另一个用户或查看他们自己的数据)。

鉴于会话不可用,我找不到保存“充当用户...”信息的好方法(没有 cookie)。我想使用角色提供者等,以便我可以利用 .NET 中内置的安全修整。这一切可能根本不可能,但我希望有人以前尝试过这个,或者对我可以尝试实施的事情提出建议。

提前致谢!!

4

2 回答 2

1

在此处查看我对类似问题的回答

它的要点是:

我这样做的方法虽然有点粗略,但我的数据库中有一个模拟表,其中包含正在模拟的用户的登录名和他们希望模拟的用户的登录名。

我添加了一些覆盖代码,以便当用户第一次进入页面时(它使用 Windows 身份验证),它将检查该用户是否在表中设置了模拟,然后将此用户 ID 放置在会话状态的对象中. 如果没有模拟,它会将实际的用户 ID 放在同一个对象中。

为了防止我像他们一样对用户的数据做任何事情,这个对象中有两个属性,一个是 login_name,系统用于内容定制,另一个是 NameForLog,用于记录任何操作. 我所做的所有操作都将被记录为我。

站点上显示用户自定义内容的所有区域都查看此会话对象,因此它们将始终使用模拟 ID,因此始终向我显示用户正在查看的内容。除了第一页和日志代码之外,它甚至不知道它正在处理的是我。

对于您的方案,您可以实现角色提供程序并覆盖 GetRolesForUser 以返回模拟用户的角色以及一些允许模拟用户访问模拟功能以将其关闭的角色。

您甚至可以将模拟用户的角色与模拟用户的角色一起返回,以便让管理员用户访问他们自己的所有功能以及他们模拟的用户,这完全取决于这将在多大程度上影响该功能的有用性你的特定场景。

于 2012-06-05T21:09:19.937 回答
1

我已经实现了类似的东西......虽然不完全像你的场景,但非常接近。

  1. 管理员登录(具有像管理员这样的一种角色)

  2. 然后管理员被重定向到“选择客户端”页面。管理员可以按 ID、名称等搜索客户。管理员从列表中选择一个客户。我将客户端 ID 存储在 cookie 中。

  3. 我有自定义 RolesProvider 调用我的自定义GetRoles(loggedinUserid)

  4. GetRoles(int loggedinUserId)然后方法确定用户的类型,即它是管理员还是非管理员。如果是管理员,则从 cookie 中获取 ClientID。将 loggedInUserID、typdofuser 和 ClientId 传递给存储过程,该存储过程将返回 admin 的所有角色 + 该 ClientId 的所有角色并返回给角色提供者。

这样我就可以使用我所有的 Admin 菜单项以及 ClientID 所需的菜单。

管理员可以随时进入“选择客户端”页面并切换到另一个客户端。当他们选择一个客户端时,新的 ClientId 将被存储在 cookie 中。

现在你有两个选择:

  1. 您可以让角色提供者在每次请求时调用它,或者

  2. 将获取的角色存储在 HttpCache 中,并在 ClientId 更改时更新此缓存。

希望这可以帮助。

于 2012-06-05T21:21:58.550 回答