ASP.NET按角色模拟

时间:2010-09-07 17:06:41

标签: asp.net iis forms-authentication impersonation

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

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

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

是否可以按照描述设置多个场景?

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

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

提前谢谢。

1 个答案:

答案 0 :(得分:3)

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

我使用interop和WindowsIdentity的组合来处理模拟。我遵循的步骤是:

  1. 使用互操作LogonUserA()登录,填充IntPtr(token)的句柄。
  2. 使用互操作DuplicateToken()复制令牌。
  3. 创建一个新的窗口标识,la:var identity = new WindowsIdentity(tokenDuplicate);
  4. 通过以下方式创建模拟上下文:var context = identity.Impersonate();
  5. 使用互操作CloseHandle()
  6. 关闭两个令牌
  7. 完成模拟后,通过以下方式撤消模拟上下文:context.Undo();
  8. 我保留一个一次性课程来处理细节。步骤1-5发生在构造函数中,步骤6发生在dispose例程中。这有助于确保即使遇到异常也能正确恢复。

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

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