Web services 使用Kerberos身份验证的WCF自托管web服务

Web services 使用Kerberos身份验证的WCF自托管web服务,web-services,wcf,kerberos,Web Services,Wcf,Kerberos,我正在尝试在自托管RESTful WCF服务上启用Kerberos身份验证。我可以从HTTP通信中看到,客户端(即Internet Explorer)正确地尝试Kerberos身份验证,但由于未知原因,我的自托管服务拒绝了Kerberos票证。然后NTLM身份验证就成功了,这是我绝对不希望看到的 服务代码: var binding = new WebHttpBinding(); binding.Security.Transport.ClientCredentialType = HttpClien

我正在尝试在自托管RESTful WCF服务上启用Kerberos身份验证。我可以从HTTP通信中看到,客户端(即Internet Explorer)正确地尝试Kerberos身份验证,但由于未知原因,我的自托管服务拒绝了Kerberos票证。然后NTLM身份验证就成功了,这是我绝对不希望看到的

服务代码:

var binding = new WebHttpBinding();
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.InheritedFromHost;

var host = new WebServiceHost(typeof(TestService), new Uri(@"http://2008Web.ad.mdm.com:3456/testservice"));
ServiceEndpoint ep = host.AddServiceEndpoint(typeof(ITestService), binding, "");
ep.Behaviors.Add(new WebHttpBehavior());

ServiceAuthenticationBehavior sab = null;
sab = host.Description.Behaviors.Find<ServiceAuthenticationBehavior>();
sab.AuthenticationSchemes = System.Net.AuthenticationSchemes.Negotiate;

ServiceMetadataBehavior smb = new ServiceMetadataBeahvior();
smb.HttpGetEnabled = true;
host.Description.Behaviors.Add(smb);

host.Open();
我已尝试将SPN(服务主体名称)注册为:

Windows事件日志和WCF日志都没有提供任何关于Kerberos身份验证失败原因的指示

当我在IIS中承载相同的服务时,Kerberos身份验证工作正常。此外,在IIS中托管服务时,我从不需要注册(或标识)SPN,它可以正常工作。直到我开始寻找这个问题,人们才开始谈论SPN。我以前从来不用担心SPN,过去我使用过几个IIS托管的Kerberos支持的web服务

什么是秘方?我错过了什么?如果有人能给我指出正确的方向,我将不胜感激。我是否可以检查/启用其他日志,以确定HTTP堆栈决定将Kerberos请求提交到地板上的原因?必须有某种方法来确定这一失败的原因

我非常确定这个问题与服务器主体名称无关,因为我可以看到域控制器确实授予Kerberos票证。在域控制器上,我没有看到KRB5KDC_ERR_S_PRINCIPAL_UNKNOWN,而是看到TGS-REP(授予Kerberos票证)。此外,我在服务器的HTTP请求中看到了Kerberos票证。因此,问题一定出在WCF自托管服务上

使用支持Kerberos的iOS7应用程序,我看到的网络跟踪略有不同。我看到域控制器将Kerberos票证授予iOS7应用程序,然后我看到Kerberos票证呈现给WCF服务(在HTTP级别)。但是,来自WCF服务(HTTP级别)的响应是HTTP 400,即错误请求。据我所知,HTTP 400通常与客户端的问题有关。也就是说,它以HTTP服务器端不支持的格式呈现HTTP数据包。综上所述,就像上面的IE示例一样,当WCF服务托管在IIS中时,一切正常。WCF日志记录中没有任何信息(由于HTTP堆栈拒绝它,因此它从未达到该级别),并且事件日志中没有与此事件相关的信息


在上面的WCF服务配置中,我是否缺少一些东西?你在上面看到的就是一切。也就是说,我没有使用应用程序配置文件来配置此WCF服务。正在以编程方式配置WCF服务。如果我删除了身份验证配置,那么一切正常。iOS7应用程序、Safari和IE都可以成功地与我的自托管WCF服务交互。

在没有常用调试工具(http错误日志、事件查看器、WCF日志等)的帮助下,我发现了问题所在。如上所述,我可以看到kerberos票证到达服务器(wire stark),但随后请求被拒绝。我推测http头可能已经超过了最大长度。我发现了以下文章:

调整以下http注册表设置后,kerberos身份验证开始工作:

MaxRequestBytes - set to 1048576
MaxFieldLength - set to 65534
虽然下面的文章没有直接帮助我解决这个问题,但也许有人会从中发现一些价值:

setspn -s host/2008Web:3456 2008Web
setspn -s host/2008Web.ad.mdm.com:3456 2008Web
setspn -s http/2008Web:3456 administrator
setspn -s http/2008Web.ad.mdm.com:3456 administrator
setspn -s http/2008Web:3456/testservice administrator
setspn -s http/2008Web.ad.mdm.com:3456/testservice administrator
MaxRequestBytes - set to 1048576
MaxFieldLength - set to 65534