【发布时间】:2014-10-21 11:46:48
【问题描述】:
我有一个 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 秒,我觉得这有点烦人。
我想知道的是,我可以在用户登录时进行模拟,并在注销或会话超时时恢复吗?换句话说,我可以通过会话保持模拟吗?
我可能没有使用正确的术语,抱歉。
【问题讨论】:
-
您是否可以让 IIS(假设您正在使用它)处理身份验证?我们使用我们的应用程序执行此操作,然后 IIS 还为您处理模拟 - 然后整个请求在用户的上下文中运行
-
是的,我在 IIS 下运行我的网站。但是 IIS 是否可以在每次登录时以不同方式模拟?还是您在谈论 IIS 中应用程序池的身份?
-
是的,每个用户都将被单独模拟。此时,事物在其安全上下文中运行,而不是在应用程序池中运行
-
好的,这听起来很有趣。那么我应该从哪里开始呢?
-
Here's a start 但配置它的细节有点超出了这个问题的原始范围:)
标签: c# asp.net-mvc-4 session impersonation