我们有一个测试 Windows Server 2012 域。有两台计算机是该域的成员。
Oracle Corporation 正在开发一台计算机,并在虚拟机上运行 Linux 的一个版本。这台机器托管了一个 SPNego Kerberos 认证的 Web 服务,大概由 IBM WebSphere 托管。
另一台计算机是托管在 Microsoft 虚拟机上的 Windows XP 客户端。
我们在 Active Directory 中创建了 SPN,以使用 Kerberos 对用户进行身份验证。
然后,我们使用浏览器测试了 Web 服务。WSDL 地址完美地带回了 SOAP 数据。
Kerberos 已关闭,因此客户端代理代码可以合并到 WCF 4.0 客户端中并再次打开以测试身份验证。
但是,当尝试使用客户端代理中提供的方法连接到 Web 服务时,会引发各种与安全相关的错误:
远程 HTTP 服务器不满足相互认证要求。 远程服务器返回错误:(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>
提供网络凭据也是在代码中完成的;但很可惜,无济于事。
谢谢你。