【问题标题】:ASP.NET Impersonation by RoleASP.NET 角色模拟
【发布时间】:2011-04-09 07:43:48
【问题描述】:

我修改了 ASP.NET 登录控件以允许指定 UserRole('Employee' 或 'Volunteer')。用户通过调用由我们的客户端编写的 web 服务进行身份验证,该服务接受用户名/密码/角色并返回 true 或 false。

  • 如果角色是“员工”,则表示活动目录用户。应用程序应使用给定的用户名/密码模拟用户。
  • 如果角色是“志愿者”,则应用程序应在预先知道用户名/密码(即在 web.config 文件中硬编码)的一组 Windows 帐户下运行。

服务器在 Windows Server 2003 上运行。我对无数的配置选择感到困惑,并试图理解我的选择;

是否可以有多个场景描述?

我应该以编程方式指定模拟还是可以通过配置文件来完成?如果是,是否需要使用 LogonUser 或 WindowsIdentity?

我应该使用什么配置文件设置? (即表单身份验证、impersonate=true 等。)

提前谢谢你。

【问题讨论】:

    标签: asp.net iis forms-authentication impersonation


    【解决方案1】:

    因为关于模拟哪个身份的决定是基于运行时数据,所以您可能必须以编程方式处理模拟。

    我结合使用互操作和 WindowsIdentity 来处理模拟。我遵循的步骤是:

    1. 使用互操作LogonUserA() 登录,它填充一个 IntPtr (token) 的句柄。
    2. 使用互操作 DuplicateToken() 复制令牌。
    3. 创建一个新的 Windows 身份,例如:var identity = new WindowsIdentity(tokenDuplicate);
    4. 通过以下方式创建模拟上下文:var context = identity.Impersonate();
    5. 使用互操作CloseHandle() 关闭两个令牌
    6. 完成模拟后,通过以下方式撤消模拟上下文:context.Undo();

    我保留了一个一次性类来处理细节。步骤 1-5 发生在构造函数中,步骤 6 发生在 dispose 例程中。这有助于确保即使在遇到异常时我也能正确恢复。

    使用这种方法,由于您通过服务方法传递凭据,因此 web.config 身份验证方案并非完全强制。但是,如果您使用集成的 Windows 身份验证,则可以通过 HttpContext.Current.User.Identity.Impersonate() 以编程方式模拟当前用户,而无需在服务方法中传递凭据。

    另一方面,您可能已经知道,PInvoke.net 是配置互操作方法签名的宝贵资源。

    【讨论】:

      猜你喜欢
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      • 2015-04-21
      • 1970-01-01
      • 2012-02-17
      • 1970-01-01
      • 1970-01-01
      • 2015-08-25
      相关资源
      最近更新 更多