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

时间:2012-06-05 20:54:37

标签: c# asp.net windows-authentication impersonation roleprovider

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

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

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

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

鉴于会话不可用,我找不到保存“代理用户...”信息的好方法(没有cookie)。我想使用角色提供程序等,以便我可以利用.NET中内置的安全修整。这一切可能都是不可能的,但我希望有人在此之前尝试过,或者建议我尝试实施。

提前致谢!!

2 个答案:

答案 0 :(得分:1)

查看我对类似问题的回答here

它的要点是:

  

我这样做的方式,实际上有点粗糙,就是要有一个   我的数据库中的模拟表,其中包含登录名   正在进行模拟和用户登录的用户   希望冒充。

     

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

     

为了防止我对用户的数据进行操作,有   这个对象中有两个属性,一个用于logon_name,它就是什么   系统用于内容定制,另一个叫做   NameForLog,用于记录任何操作。我做的所有动作   将以我身份登录。

     

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

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

您甚至可以使用模拟用户的角色返回模拟用户的角色,以便让管理员用户可以访问他们自己的所有功能以及他们模仿的用户,这一切都取决于这会影响用户的实用程度。特定场景中的功能。

答案 1 :(得分:1)

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

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

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

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

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

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

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

    现在你有两个选择:

    1. 您可以让rolesprovider在每次请求或

    2. 时调用此方法
    3. 将获取的角色存储在HttpCache中,并在ClientId发生更改时更新此缓存。

    4. 希望这有帮助。