我能否在某些情况下关闭身份模拟?

19

我有一个应用程序,其中使用了模拟身份功能。但是,当用户以管理员身份登录时,有些操作需要他们直接写入服务器。现在,如果这些用户没有实际服务器的权限(有些用户确实没有),它就不会让他们写入。

我想做的是仅为几个命令关闭模拟身份功能。

是否有办法做到这一点?

using(HostingEnvironment.Impersonate.Off())
  //I know this isn't a command, but you get the idea?

谢谢。
4个回答

24

确保应用程序池拥有您需要的适当权限。

然后,在您想要还原为应用程序池身份时...运行以下内容:

private WindowsImpersonationContext context = null;
public void RevertToAppPool()
{
    try
    {
        if (!WindowsIdentity.GetCurrent().IsSystem)
        {
            context = WindowsIdentity.Impersonate(System.IntPtr.Zero);
        }
    }
    catch { }
}
public void UndoImpersonation()
{
    try
    {
        if (context != null)
        {
            context.Undo();
        }
    }
    catch { }
}

2

我不确定这是否是首选方法,但当我想要做到这一点时,我会新建一个WindowsIdentity实例,并调用Impersonate方法。这允许后续代码模拟不同的Windows用户。它返回一个WindowsImpersonationContext,该上下文具有一个Undo方法,可将模拟上下文恢复为原来的状态。


你知道有没有什么方法可以在不指定任何地方的情况下调用默认的 web_app 账户吗? - naspinski

0

您可以关闭页面的身份验证,然后在代码的其余部分手动模拟已验证的用户。

http://support.microsoft.com/kb/306158

这与最后一部分有关,但基本上您会模拟User.Identity

这意味着您将不得不在调用页面之前进行模拟,在需要关闭它时将其关闭,然后在完成时重新启用它,但这应该是可行的解决方案。


0

我最终只是给“已验证用户”赋予了文件夹的写入权限


也可以这样做。但是它会留下一些巨大的安全风险。因为即使匿名用户也能够写入那个文件夹。我强烈建议您创建一个类来还原应用程序池身份。然后使用该实例进行还原操作。 - Maxime Rouiller

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接