问题是我无法使用wsHttpBinding进行Windows身份验证。
这是配置:
<services>
<service name="WcfService1.Service1">
<endpoint address="" bindingConfiguration="testbinding" contract="WcfService1.IService1" binding="wsHttpBinding"/>
</service>
</services>
<bindings>
<wsHttpBinding>
<binding name="testbinding">
<security mode="Transport">
<transport clientCredentialType="Windows"/>
</security>
</binding>
</wsHttpBinding>
</bindings>
这是尝试调用方法时服务器的响应: HTTP请求未经授权使用客户端身份验证方案“Negotiate”。从服务器接收的认证头是'Negotiate oXMwcaADCgEBomoEaGBmBgkqhkiG9xIBAgIDAH5XMFWgAwIBBaEDAgEepBEYDzIwMTcwODE2MjA1MjQwWqUFAgMK8G2mAwIBKakOGwxDT1JQLlNBQUIuU0WqGjAYoAMCAQGhETAPGw1jb3JwYXBwbDU5ODgk'。 还有一个内部异常说: “目标主要名称不正确”
我已经在IIS中设置了一个新站点,用于测试目的,启用了Windows身份验证,其他所有功能都被禁用(我没有进行任何ASP模拟/双跳)。 Windows身份验证的提供商是Negotiate,Ntlm。启用内核模式身份验证。 应用程序池正在运行Active Directory服务帐户。 最终的目标是使用Kerberos进行身份验证,但由于它甚至不能与Ntlm一起使用,我还没有开始使用SPN以及那些让kerberos正常工作的东西。
如果我将应用程序池更改为使用“ApplicationPoolIdentity”而不是AD服务帐户运行,它确实有效吗? 我必须使用AD服务帐户运行应用程序池。
如果我将配置更改为:
<services>
<service name="WcfService1.Service1">
<endpoint address="" bindingConfiguration="hbinding" contract="WcfService1.IService1" binding="basicHttpsBinding"/>
</service>
</services>
<bindings>
<basicHttpsBinding>
<binding name="hbinding">
<security mode="Transport">
<transport clientCredentialType="Windows"/>
</security>
</binding>
</basicHttpsBinding>
它工作正常(保持AD服务帐户),为什么? 我不想使用basicHttpsBinding
我看到客户端配置文件(使用wcftestclient)的区别在于使用wshttp时它有:
<identity>
<userPrincipalName value="serviceaccount@contoso.com" />
</identity>
这与此有关吗? (在这里疯狂地猜测)
端点是Windows Server 2012R2上的https,IIS 8。
答案 0 :(得分:0)
很大程度上取决于您的域名设置方式,但您可以尝试不同类型的客户端凭据类型:
<services>
<service name="WcfService1.Service1">
<endpoint address="" bindingConfiguration="testbinding" contract="WcfService1.IService1" binding="wsHttpBinding"/>
</service>
</services>
<bindings>
<wsHttpBinding>
<binding name="testbinding">
<security mode="Transport">
<transport clientCredentialType="Ntlm"/>
</security>
</binding>
</wsHttpBinding>
</bindings>
此外,使用wsHttpBinding,会在场景后面进行协商。因为关于该谈判的指导没有具体定义,所以有时候将其关闭是有道理的:
<services>
<service name="WcfService1.Service1">
<endpoint address="" bindingConfiguration="testbinding" contract="WcfService1.IService1" binding="wsHttpBinding"/>
</service>
</services>
<bindings>
<wsHttpBinding>
<binding name="testbinding">
<security mode="Transport">
<message negotiateServiceCredential="false" />
</security>
</binding>
</wsHttpBinding>
</bindings>
必须存在Kerberos域才能使其正常工作。
答案 1 :(得分:0)
在客户端,生成的身份标签导致了问题
<identity>
<userPrincipalName value="serviceaccount@contoso.com" />
</identity>
如果我清除它的值,它可以正常工作。 所以我在web.config中清除了该值。 我现在可以设置kerberos并且它也可以正常工作,也可以尝试设置servicePrincipalName标记。