要么未提供所需的模拟级别,要么提供的模拟级别无效。

11

我在使用WCF服务和模拟用户身份时遇到了一些问题,我已经将问题精简为下面的一个简单方法。该WCF服务目前在一个exe文件中进行自托管。异常消息为“未提供所需的模拟级别或提供的模拟级别无效”。通过检查错误抛出的位置,我发现标识ImpersonationLevel设置为委托,正如我的客户端所规定的,并且已通过Kerberos进行身份验证。

我有点困惑,因为在我看来,模拟级别和身份验证的要求已经得到满足。我的想法是问题可能与域设置有关,我已经设置并且认为设置正确。因此,我有两个问题:

  1. 下面的操作应该成功吗?(或者存在缺陷吗?)
  2. 需要在Win2k8域上配置哪些设置才能使其工作?我正在使用两台属于同一个Win2k8域的计算机(这是一个新域,非常基本,旨在测试模拟用户身份)。

代码如下:

[OperationBehavior(Impersonation = ImpersonationOption.Required)]
public string Test()
{
    WindowsIdentity identity = ServiceSecurityContext.Current.WindowsIdentity;
    using (identity.Impersonate())
    {
        ProcessStartInfo pi = new ProcessStartInfo(@"c:\temp\test.bat");
        pi.UseShellExecute = false;
        pi.RedirectStandardOutput = true;
        Process p = Process.Start(pi); // exception thrown here!
        p.WaitForExit();
        string o = p.StandardOutput.ReadToEnd();
        return o;
    }
}

异常详细信息:

Win32Exception occurred: Either a required impersonation level was not provided, or the provided impersonation level is invalid
   at System.Diagnostics.Process.CreatePipeWithSecurityAttributes(SafeFileHandle& hReadPipe, SafeFileHandle& hWritePipe, SECURITY_ATTRIBUTES lpPipeAttributes, Int32 nSize)
   at System.Diagnostics.Process.CreatePipe(SafeFileHandle& parentHandle, SafeFileHandle& childHandle, Boolean parentInputs)
   at System.Diagnostics.Process.StartWithCreateProcess(ProcessStartInfo startInfo)
   at System.Diagnostics.Process.Start()
   at System.Diagnostics.Process.Start(ProcessStartInfo startInfo)
   at MonetEnterprise.Service.SecurityService.Test()

Test.bat 文件内容

回显 %username%


1
在进入using块之前,使用调试器时identity等于什么? - Security Hound
嗨@Rahmhound,这是客户端的登录 - 这是您所期望的吧? - Martin Clarke
1
NT域默认情况下禁用委派。如果需要(看起来是这样),则必须启用它。请参见启用受限委派如何在.NET和Active Directory中使用受限委派启用多跳身份验证 - Remus Rusanu
2个回答

9
  1. 如果你使用的是.NET Process类,那么它就存在缺陷,因为它始终会以父进程的身份启动。要在另一个身份下运行它,看起来必须使用win32 api CreateProcessAsUser(我还没有使其正常工作)。

  2. 我需要以提升的权限运行它(即Visual Studio以管理员身份运行)。


3
这是解决我的应用程序问题的方法:
  1. 进入开始菜单 > 设置 > 控制面板 > 管理工具 > 本地安全策略
  2. 展开“本地策略”并选择“用户权限分配”
  3. 在右侧窗格中,双击“模拟客户端身份验证后”
  4. 在“安全策略设置”对话框中,单击“添加用户或组”
  5. 在“选择用户、计算机或组”对话框中,输入“IIS_IUSRS”
  6. 选择“检查名称”,并验证名称是否正确
来源:如果未输入完整路径,则出现500内部服务器错误(0x80070542)

微软文档在这里:https://learn.microsoft.com/en-us/windows/security/threat-protection/security-policy-settings/impersonate-a-client-after-authentication - David
那对我有用 - 我只是不知道为什么 IIS_IUSRS 不见了。 谢谢! - undefined

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