ASP.NET 在使用 Windows 身份验证和自定义角色提供程序时实现“充当”功能

本文关键字:程序 实现 功能 充当 角色 NET Windows 自定义 身份验证 ASP | 更新日期: 2023-09-27 18:36:28

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

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

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

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

我找不到保存"以用户身份行事..."给定会话不可用的信息。我想使用角色提供程序等,以便可以利用 .NET 中的内置安全修整。 这一切可能根本不可能,但我希望有人以前尝试过这个,或者对我可以尝试实现的东西有建议。

提前感谢!!

ASP.NET 在使用 Windows 身份验证和自定义角色提供程序时实现“充当”功能

在这里查看我对类似问题的回答

它的要点是:

我这样做的方式,诚然有点粗糙,是有一个 我的数据库中的模拟表,其中包含 正在模拟的用户和他们的用户登录 希望冒充。

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

为了防止我像他们一样对用户的数据做事,有 此对象中的两个属性,一个用于logon_name,即 系统用于内容自定义,另一个称为 NameForLog,在记录任何操作时使用。我所做的所有操作 将以我的身份登录。

网站上显示用户自定义内容的所有区域都会查看 此会话对象,因此它们将始终使用模拟的 ID 和 因此,始终向我显示用户所看到的内容。超越第一个 页面和日志记录代码,它甚至不知道是我 处理。

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

您甚至可以将模拟用户的角色与模拟用户的角色一起返回,以便授予管理员用户访问其自己的所有功能以及他们正在模拟的用户的权限,这完全取决于这会对功能在特定方案中的有用性产生多大影响。

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

    管理员
  1. 登录(具有一个角色,如管理员)

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

  3. 我有自定义角色提供程序调用我的自定义GetRoles(loggedinUserid);

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

这样,我就有了管理员的所有菜单项以及 ClientID 所需的菜单。

管理员可以随时转到"选择客户端"页面并切换到另一个客户端。当他们选择客户端时,新的客户端 ID 将存储在 cookie 中。

在此之后,现在您有两个选择:

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

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

希望这有帮助。