WCF互操作性Kerberos SPNego启用的Web服务

时间:2013-08-31 22:36:05

标签: wcf soap active-directory wcf-client spnego

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

提供网络凭证也是在代码中完成的;但是,唉,无济于事。

谢谢。

1 个答案:

答案 0 :(得分:1)

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

您获得的具体错误可能意味着服务器在您发送SOAP12时使用SOAP11(例如,您可能需要基本的http绑定)。但是,任何配置更改都必须在了解服务器允许的更多SOAP的情况下完成。