所以我一直在努力解决这个问题。我有一个自托管的 WCF 服务:
var webServiceHost = new WebServiceHost(helloWorld);
webServiceHost.Authorization.ImpersonateCallerForAllOperations = true;
var uri = new Uri(BaseUri + webService.UriDirectory);
var webHttpBinding = new WebHttpBinding(webHttpSecurityMode);
webHttpBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows;
var sep = webServiceHost.AddServiceEndpoint(IHelloWorld, webHttpBinding, uri);
var webHttpBehavior = new WebHttpBehavior {HelpEnabled = true};
sep.Behaviors.Add(webHttpBehavior);
webServiceHost.Open();
我已经继续并将以下属性应用于我的方法:
[OperationBehavior(Impersonation = ImpersonationOption.Required)]
public List<GpoItem> GetAll()
{
using (ServiceSecurityContext.Current.WindowsIdentity.Impersonate())
{
// Execute GPO code here...
return new List<GpoItem>();
}
}
为了添加更多上下文,我基本上有一个 Web 服务,它允许人们登录网页,在域上创建 GPO。在控制台中运行它可以正常工作,因为我以登录域用户的身份运行它。将其作为 Windows 服务运行,会引发“拒绝访问”异常。因此需要冒充。我在上面输入了以下更改后的代码,我得到“发生操作错误。(来自 HRESULT 的异常:0x80072020)'。谷歌搜索显示它仍然是一个许可问题。我以管理员身份登录到 Web 服务测试环境,因此我拥有完全访问权限,并且我已经证明我可以以管理员身份在控制台中运行它。我觉得我在某些地方缺少一些标志设置。
有任何想法吗?
[Update1]我尝试将服务从作为本地系统运行切换到网络服务,但我仍然遇到同样的问题。
[Update2]当我登录到托管我的 WCF 服务的服务器(作为本地系统运行)并直接在该机器上使用浏览器时,一切正常。委托用户身份验证似乎是一个问题......这里仍然未知。