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

时间:2015-05-30 03:10:13

标签: web-services wcf kerberos

我正在尝试在自托管的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();

这是观察到的HTTP流量:

adfsserver.ad.mdm.com   2008WEB                    HTTP:Request, GET /testservice/Test 
2008WEB                 adfsserver.ad.mdm.com      HTTP:Response, HTTP/1.1, Status: Unauthorized, URL: /testservice/Test , Using Negotiate Authentication 
adfsserver.ad.mdm.com   2008WEB                    HTTP:Request, GET /testservice/Test , Using GSS-API Authorization  (****Kerberos Ticket in header*****)
2008WEB                 adfsserver.ad.mdm.com      HTTP:Response, HTTP/1.1, Status: Unauthorized, URL: /testservice/Test , Using GSS-API Authentication 
adfsserver.ad.mdm.com   2008WEB                    HTTP:Request, GET /testservice/Test , Using GSS-API Authorization  (****NTLM Ticket in header*****)
2008WEB                 adfsserver.ad.mdm.com      HTTP:Response, HTTP/1.1, Status: Ok, URL: /testservice/Test , Using oRswGaADCgEAoxIEEAEAAABdREAy5JJFLAAAAAA= Authentication

我尝试将SPN(服务主体名称)注册为:

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

Windows事件日志和WCF日志记录均未提供有关Kerberos身份验证失败原因的任何指示。

当我在IIS中托管相同的服务时,Kerberos身份验证工作正常。此外,我在IIS中托管服务时从未注册(或识别)SPN,它只是有效。直到我开始寻找这个问题,个人才谈到SPN。我以前从未担心过SPN,过去我曾使用过多个支持过Kerberos的Web服务。

秘诀是什么?我错过了什么?如果有人能指出我正确的方向,我真的很感激。是否有任何其他日志我可以检查/启用以希望识别为什么HTTP堆栈决定在地板上发出Kerberos请求?必须有某种方法来确定失败的原因。

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

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

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

1 个答案:

答案 0 :(得分:1)

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

Kerberos authentication failing with 401

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

MaxRequestBytes - set to 1048576
MaxFieldLength - set to 65534

虽然以下文章没有直接帮助我解决我的问题,但也许有人会发现它有一些价值:

Things to check when Kerberos authentication fails using IIS/IE