0

我们有一个测试 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>

提供网络凭据也是在代码中完成的;但很可惜,无济于事。

谢谢你。

4

1 回答 1

1

最好的情况是,如果您可以获得由一个堆栈(例如客户端和服务器是 java)生成的示例工作请求/响应对(或在 spnego 的情况下为多条消息)。那么这将是一个将 WCF 调整为这些消息之一的游戏。目前有太多的未知数。此外,AFAIK SPNEGO 是仅支持 WCF 的协议(= SOAP 消息级别的 Windows 凭据协商),因此服务器可能使用其他东西。

您得到的具体错误可能暗示服务器在您发送 SOAP12 时使用 SOAP11(例如,您可能需要基本的 http 绑定)。但是任何配置更改都必须在了解更多关于服务器允许的 SOAP 的上下文中进行。

于 2013-08-31T22:45:03.030 回答