繁体   English   中英

按角色的ASP.NET模拟

[英]ASP.NET Impersonation by Role

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

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

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

是否可能有上述多种情况?

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

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

先感谢您。

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

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

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

我会安排一个一次性课程来处理细节。 步骤1-5在构造函数中发生,而步骤6在处理例程中发生。 这有助于确保即使遇到异常我也可以正确还原。

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

顺便说一句 ,您可能已经知道, PInvoke.net是用于为互操作方法配置签名的宝贵资源。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM