我在使用WCF服务和模拟用户身份时遇到了一些问题,我已经将问题精简为下面的一个简单方法。该WCF服务目前在一个exe文件中进行自托管。异常消息为“未提供所需的模拟级别或提供的模拟级别无效”。通过检查错误抛出的位置,我发现标识ImpersonationLevel设置为委托,正如我的客户端所规定的,并且已通过Kerberos进行身份验证。
我有点困惑,因为在我看来,模拟级别和身份验证的要求已经得到满足。我的想法是问题可能与域设置有关,我已经设置并且认为设置正确。因此,我有两个问题:
- 下面的操作应该成功吗?(或者存在缺陷吗?)
- 需要在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%
using
块之前,使用调试器时identity
等于什么? - Security Hound