2010-09-07 78 views
1

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

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

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

是否有可能具有多个场景描述?

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

应该使用什么配置文件设置? (即Forms认证,impersonate = true等)。

预先感谢您。

回答

3

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

我使用interop和WindowsIdentity的组合来处理模拟。我遵循的步骤如下:使用互操作LogonUserA(),填补一个句柄一个IntPtr(token

  1. 日志。
  2. 复制代码与互操作DuplicateToken()
  3. 创建一个新窗口标识,la: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是配置互操作方法签名的宝贵资源。

相关问题