我有一个mvc4 Web应用程序,用户使用漫游配置文件用户帐户登录。我通过Active Directory
对它们进行身份验证。在几乎所有方法中,我都需要模拟登录用户进行一些文件操作。
我使用以下方法进行模拟:
[DllImport("advapi32.dll", SetLastError = true)]
public static extern int LogonUser ( string lpszUsername, string lpszDomain, string lpszPassword, int dwLogonType, int dwLogonProvider, out IntPtr phToken );
[DllImport("advapi32.dll", SetLastError = true)]
public static extern int ImpersonateLoggedOnUser ( IntPtr hToken );
[DllImport("advapi32.dll", SetLastError = true)]
static extern int RevertToSelf ();
[DllImport("kernel32.dll", SetLastError = true)]
static extern int CloseHandle ( IntPtr hObject );
private IntPtr lnToken;
我已将我的模仿作为IDisposable
类实现,并且constructor
我冒充Dispose
方法,我回复到模仿之前的用户。所以我可以在我的控制器方法中轻松地在using
语句中使用它:
public ActionResult SomeAction ( string param )
{
using ( new Impersonator( username, password, nameSpace) )
{
/// do staff
}
}
这种方法运行得很好,虽然我认为这会减慢网站的响应时间约1.5-2秒,我发现这有点烦人。
我想知道的是,我可以在用户登录时进行模拟,并在注销或会话超时时恢复吗?换句话说,我可以通过会话保持模拟活动吗?
我可能没有使用正确的术语,抱歉。
答案 0 :(得分:1)
如果您能够,我建议您使用IIS在此方案中执行身份验证和模拟。如果你:
当人们从网站请求页面时,IIS将向浏览器发出HTTP 401 Challenge。如果它位于同一个域中并且浏览器支持它(IE和Chrome自动执行),则当前用户将自动登录该站点。如果他们不在域外,浏览器将显示一个用于身份验证的登录框。
请注意,如果您使用的是基本身份验证,凭据会以纯文本形式发送,因此拥有正确安全的https连接非常重要。
一旦通过IIS进行身份验证,只有那时请求才会到达.Net - 此时它将在用户的安全上下文中运行,而不是在应用程序池中运行。请注意,请致电:
System.Security.Principal.WindowsIdentity.GetCurrent().Name
将显示模拟用户。