【问题标题】:How to get WCF and Java clients to work. Expert help needed如何让 WCF 和 Java 客户端工作。需要专家帮助
【发布时间】:2011-11-12 16:27:59
【问题描述】:

背景(有点长)

几年前,我为客户编写了一个 WCF 服务,该服务配置为使用安全模式 =“Transport”和 clientCredentialType =“Certificate”的 basicHttpBinding,即客户端使用(客户端)证书对自己进行身份验证。该服务使用自定义 AuthorizationManager 检查传入证书的指纹是否存在于有效证书指纹的预定义列表中。如果传入的证书被认为是有效的,则允许操作继续(如果不是,则抛出异常)。

这项服务已经完美运行了大约四年,每个人都很满意。然而,由于经常发生需求变化,最近开发人员联系了我的客户,希望将他们的应用程序连接到我的客户服务。唯一的问题是这些开发人员正在使用 Java 的一些变体作为他们的首选平台,现在我们面临着一些严重的问题。长话短说,没有人设法让他们的 Java 实现(例如 Metro、Axis2)与当前配置的服务一起工作。

上周,我们尝试通过将绑定更改为安全模式 = "TransportWithMessageCredential" 和 Message clientCeredentialType = "UserName" 的 wsHttpBinding 来让它与用 Java(Metro、JAX-WS)编写的客户端一起工作。我还在配置文件中的服务凭证元素中添加了一个自定义 UserNamePassWordValidatorType。

然后我注释掉了自定义 AuthorizationManager,因为没有来自客户端的证书。

瞧,这一次我们让 SoapUI 和 Java 客户端都可以与服务对话了。

(顺便说一句,我们的服务是自托管在 Windows 服务中的)

很高兴,我们决定用两个绑定配置服务,一个已经运行了很长时间没有故障的现有 basicHttpBinding,另一个是新测试的 wsHttpBinding。所以我们会有类似的东西:

<services>
    <service name="SuperDuperService" behaviorConfiguration="superDuperBehaviour">
        <endpoint binding="basicHttpBinding" contract="ISuperDuperService" bindingConfiguration="SecureTransport"/>
        <endpoint binding="wsHttpBinding" address="stws" contract="ISuperDuperService" bindingConfiguration="SecureTransportAndSoap"/>
        <endpoint binding="mexHttpsBinding" address="mex" contract="IMetadataExchange" />
        <host>
            <baseAddresses>
                <add baseAddress="https://<url + port>/SuperDuperService"/>
            </baseAddresses>
        </host>
    </service>
</services>
<bindings>
    <basicHttpBinding>
        <binding name="SecureTransport" maxBufferSize="2065536" maxBufferPoolSize="524288" maxReceivedMessageSize="2065536">
            <security mode="Transport">
                <transport clientCredentialType="Certificate"/>
            </security>
            <readerQuotas maxDepth="32" maxStringContentLength="6553600" maxArrayLength="2065536"
                maxBytesPerRead="4096" maxNameTableCharCount="16384" />
        </binding>
    </basicHttpBinding>
    <wsHttpBinding>
        <binding name="SecureTransportAndSoap">
            <security mode="TransportWithMessageCredential">
                <message clientCredentialType="UserName"/>
            </security>
        </binding>
    </wsHttpBinding>
</bindings>
<behaviors>
    <serviceBehaviors>
        <behavior name="superDuperBehaviour">
            <serviceCredentials>
                <!-- The following element specifies the certificate use by this service for HTTPS (SSL) based transport security -->
                <serviceCertificate findValue="<some identifier>"
                        storeLocation="LocalMachine"
                        storeName="My"
                        x509FindType="FindBySubjectName" />
                <userNameAuthentication userNamePasswordValidationMode ="Custom" customUserNamePasswordValidatorType 

="SupportClasses.CustomUserNameValidator,SupportClasses"/>
            </serviceCredentials>
            <!-- The following element specifies how we're authorizing based on the client certificates received -->
            <serviceAuthorization serviceAuthorizationManagerType="SupportClasses.AuthorizationManager, SupportClasses"/>
            <serviceMetadata httpsGetEnabled="true"/>
            <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
    </serviceBehaviors>
</behaviors>

那么您可能会问的问题在哪里?好吧,看到&lt;serviceBehavior&gt; 元素了吗?您可能知道此元素全局应用于服务,这意味着在运行时将调用 CustomUserNameValidator 和 AuthorizationManager。后者会抱怨当客户端使用 wsHttpBinding 调用服务时没有证书存在!

啊!

替代解决方案

到目前为止,这些是我想出的替代解决方案:

替代 1) 创建另一个 Windows 服务,在不同的 URL 上托管我们的 WCF 服务。然后这两个服务将有一个单独的配置。

备选方案 2) 创建两个托管在同一个 Windows 服务中的服务实现,并在元素中公开它们,每个都有自己的绑定和 serviceBehaviour

备选方案 3) 确定是否有可能保留当前配置并让 CustomUserNameValidator 和 AuthorizationManager 和平共处

很抱歉这篇长文,但在为我的问题提供背景时,我需要彻底。

问题 1) 有没有人让 WCF 使用非平凡的配置与 Java 客户端一起工作?

问题 2) 有人对如何解决备选方案 3 提出过建议吗? (如果可能的话)

问题 3) 如果有的话,您会推荐上述备选方案中的哪一个?

问题 4) 你知道我还没有想到的其他替代方案吗?

作为记录,我研究了 WCF 互操作性工具,但我真的看不出它对我们有什么帮助。如果有人阅读本文后使用互操作性“向导”取得了良好的效果,

请告诉我。

提前致谢。

--诺吉

【问题讨论】:

    标签: java wcf authentication authorization servicebehavior


    【解决方案1】:

    我将首先在 //services 中添加第二个元素,并使用新的 @bindingConfiguration 属性和不同的 @address 属性对其进行配置。我认为这会比备选方案 1、2 或 3 更简单;或者可能是备选方案 3,我不知道。

    Web 服务的存在是为了提供与语言、供应商、平台和供应商无关的互操作。 WCF 和 Java 每天都在现实世界的解决方案中进行互操作。

    你看过WCF and Java interoperation上的这个系列吗?

    另外,听起来您会从使用一些诊断工具中受益,这些工具可以让您看到 .NET/WCF 客户端消息和 Java 客户端消息之间的差异。使用 Fiddler 或其他一些嗅探器实用程序查看线路上的消息。打开 WCF 跟踪以查看 WCF 在收到消息后会做什么。

    【讨论】:

    • 感谢您的回复。我会阅读您提供的文章系列。在诊断方面,我们使用了 WCF 跟踪来确认客户端证书丢失。我们已经设法使用用户名/密码身份验证使其工作,但客户端证书问题仍然困扰着我们。我最终编写了一个在本地运行的桥接服务,以处理与该服务的安全对话。然后,Java 解决方案使用普通的基本 http 绑定与桥接服务通信。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-16
    • 2017-09-22
    • 2015-02-11
    • 2011-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多