【问题标题】:Can I impersonate through the whole session?我可以模拟整个会话吗?
【发布时间】: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


【解决方案1】:

如果可以的话,我建议在这种情况下使用 IIS 为您执行身份验证和模拟。如果你:

当人们从站点请求页面时,IIS 将向浏览器发出 HTTP 401 质询。如果它位于同一个域中并且浏览器支持它(IE 和 Chrome 会自动支持),当前用户将自动登录到该站点。如果他们在域之外,浏览器将显示一个登录框进行身份验证。

请注意,如果您使用的是基本身份验证,则凭据以纯文本形式发送,因此拥有适当安全的 https 连接非常重要。

一旦通过 IIS 进行身份验证,请求才会到达 .Net - 此时它将在用户的安全上下文中运行,而不是在应用程序池中运行。请注意,调用:

System.Security.Principal.WindowsIdentity.GetCurrent().Name

将显示模拟用户。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-25
    • 2010-12-30
    • 2011-11-27
    • 1970-01-01
    • 2011-08-22
    • 2016-09-23
    • 2011-11-07
    • 1970-01-01
    相关资源
    最近更新 更多