Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# “ASP.NET实现”;充当;使用Windows身份验证和自定义角色提供程序时的功能_C#_Asp.net_Windows Authentication_Impersonation_Roleprovider - Fatal编程技术网

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

C# “ASP.NET实现”;充当;使用Windows身份验证和自定义角色提供程序时的功能,c#,asp.net,windows-authentication,impersonation,roleprovider,C#,Asp.net,Windows Authentication,Impersonation,Roleprovider,我正在尝试为ASP.NET应用程序实现“作为”功能,同时使用Windows身份验证和自定义角色提供程序。基本上,我希望能够做到的是: 使用Windows Auth获取当前用户的域帐户,以验证他们是否是经批准的域用户 使用自定义角色提供程序从SQL Server数据库获取权限信息 实现功能以允许应用程序的管理员能够“充当”另一个用户,而不需要他们作为该用户实际登录到应用程序 我试图实现的场景是,应用程序管理员试图帮助用户解决问题,并单击“作为”按钮以该用户的身份查看应用程序。因此,角色提供程序

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

  • 使用Windows Auth获取当前用户的域帐户,以验证他们是否是经批准的域用户
  • 使用自定义角色提供程序从SQL Server数据库获取权限信息
  • 实现功能以允许应用程序的管理员能够“充当”另一个用户,而不需要他们作为该用户实际登录到应用程序
我试图实现的场景是,应用程序管理员试图帮助用户解决问题,并单击“作为”按钮以该用户的身份查看应用程序。因此,角色提供程序需要了解当前用户的身份,并获取该用户而不是当前用户的权限信息

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

由于会话不可用,我找不到保存“作为用户…”信息的好方法(没有cookie)。我想使用角色提供者等,这样我就可以利用.NET中内置的安全功能。这一切可能根本不可能,但我希望有人曾经尝试过这一点,或者对我可以尝试实现的东西有一个建议


提前谢谢

查看我对类似问题的回答

其要点是:

我做这件事的方式,承认有点粗鲁,就是有一个 我的数据库中的模拟表,其中包含 正在进行模拟的用户及其所属用户的登录 我想冒充

我添加了一些覆盖代码,这样当用户第一次访问 页面(它使用Windows身份验证),它将检查 用户在表中设置了模拟,然后放置此用户id 在会话状态的对象中。如果没有模仿,那就是 将实际用户id放置在此同一对象中

为了防止我像处理用户数据一样处理用户数据,有 此对象中有两个属性,一个用于登录名,即 由系统用于内容定制,另一个称为 NameForLog,用于记录任何操作。我所做的一切 将以我的身份登录

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

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


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

我已经实现了类似的功能……虽然与您的场景不完全相同,但非常接近

  • 管理员登录(有一个类似管理员的角色)

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

  • 我有一个自定义角色Provider,它调用我的自定义
    GetRoles(loggedinUserid)

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

  • 通过这种方式,我可以使用所有管理菜单项以及ClientID所需的菜单

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

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

  • 您可以让RoleProvider根据每个请求或

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


  • 希望这能有所帮助。

    感谢您的反馈,并对响应的长时间延迟表示抱歉。我知道我可以编写代码来解决这个问题,但我曾希望有一种方法,我仍然可以利用内置的安全性,这样我就可以对所有菜单和位置安全性进行修剪,而不必输入自定义代码来处理这些部分。基本上,我希望我可以避免将自定义安全代码写入单独的页面等来处理此问题,尽管这似乎不太可能。感谢您的反馈。我想我在问题中提到,饼干是我想要避免的东西,因为它们比我想要的更持久。也就是说,我不希望此“作为”功能在浏览器窗口/会话中持续存在。我希望它是特定于当前的