我们有一个测试Windows Server 2012域。有两台计算机是该域的成员。
Oracle公司正在开发一台计算机,并在虚拟机上运行Linux版本。该机器托管了一个由IBM WebSphere托管的SPNego Kerberos认证Web服务。
另一台计算机是托管在Microsoft虚拟机上的Windows XP客户端。
我们在Active Directory中创建了SPN,以使用Kerberos对用户进行身份验证。
然后我们使用浏览器测试了Web服务。 WSDL地址完美地带回了SOAP数据。
Kerberos已关闭,因此客户端代理代码可以合并到WCF 4.0客户端中,然后再次打开以进行身份验证测试。
但是,当尝试使用客户端代理中提供的方法连接到Web服务时,会出现各种与安全相关的错误:
The remote HTTP server did not satisfy the mutual authentication requirement. The remote server returned an error: (405) Method Not Allowed.
下面是用于连接Web服务的客户端App.config文件:
<configuration>
<system.serviceModel>
<client>
<endpoint address="http://oag:8080/pos/GetStoreConfigurationService"
binding="wsFederationHttpBinding"
bindingConfiguration="wsFederationHttpBinding_ESLGetStoreConfigurationBinding"
behaviorConfiguration="ServiceBehavior"
contract="ESLGetStoreConfigurationPortType"
name="wsFederationHttpBinding_ESLGetStoreConfigurationPort" >
<identity>
<servicePrincipalName value="http/oag:8080"/>
</identity>
</endpoint>
</client>
<bindings>
<customBinding>
<binding name="UsernameBinding">
<binaryMessageEncoding />
<security authenticationMode="Kerberos"
requireSecurityContextCancellation ="false"
requireSignatureConfirmation="false"
messageProtectionOrder ="EncryptBeforeSign"
requireDerivedKeys="false"
enableUnsecuredResponse="true"
allowInsecureTransport="true"
securityHeaderLayout="Lax" >
</security>
<httpTransport authenticationScheme="Negotiate"
transferMode="Buffered"
maxReceivedMessageSize="67819876"/>
</binding>
</customBinding>
<wsFederationHttpBinding>
<binding name="wsFederationHttpBinding_ESLGetStoreConfigurationBinding" >
<security mode="Message">
<message negotiateServiceCredential="true"
establishSecurityContext="false"
algorithmSuite="Basic128" >
<issuer address="http://192.168.100.25"
bindingConfiguration="UsernameBinding"
binding="customBinding">
<identity>
<dns value="WIN-7TN6ALB4TVK.oag-dev.sei"/>
</identity>
</issuer>
</message>
</security>
</binding>
</wsFederationHttpBinding>
</bindings>
<behaviors>
<endpointBehaviors>
<behavior name="ServiceBehavior">
<clientCredentials>
<windows allowedImpersonationLevel="Identification"/>
</clientCredentials>
</behavior>
</endpointBehaviors>
</behaviors>
</system.serviceModel>
<system.web>
<identity impersonate="false" userName="oag-server" password="Password!"/>
</system.web>
提供网络凭证也是在代码中完成的;但是,唉,无济于事。
谢谢。
答案 0 :(得分:1)
最好的情况是,如果您可以获得由一个堆栈生成的示例工作请求/响应对(或spnego情况下的多个消息)(例如,客户端和服务器是java)。然后,它将是一个调整WCF到这些消息之一的游戏。目前还有太多未知数。此外,AFAIK SPNEGO是仅支持WCF的协议(= SOAP消息级别的Windows凭证协商),因此服务器可能使用其他内容。
您获得的具体错误可能意味着服务器在您发送SOAP12时使用SOAP11(例如,您可能需要基本的http绑定)。但是,任何配置更改都必须在了解服务器允许的更多SOAP的情况下完成。