【问题标题】:Migrating WSE Client to WCF - how to replace SecurityPolicyAssertion and UsernameToken?将 WSE 客户端迁移到 WCF - 如何替换 SecurityPolicyAssertion 和 UsernameToken?
【发布时间】:2013-09-04 21:41:15
【问题描述】:

我有一个用 Java 实现的 Web 服务,当前由 WSE 3.0 客户端调用,我想从 WSE 迁移到 WCF。使用标准工具,我创建了一个可以调用 Web 服务的客户端,但它返回一个 SoapException 并显示“缺少必需的参数值”消息。 Web 服务使用 HTTPS 并要求提供用户名和密码。在现有的WSE客户端代码中,子类SecurityPolicyAssertion和SendSecurityFilter支持的凭证区,如下:

            public class UTClientAssertion : SecurityPolicyAssertion
            {
                public UTClientAssertion()
                {
                }

                public override SoapFilter CreateClientOutputFilter(FilterCreationContext context)
                {
                    return new ClientOutputFilter(this, context);
                }

                public override SoapFilter CreateClientInputFilter(FilterCreationContext context)
                {
                    // we don't provide ClientInputFilter
                    return null;
                }

                public override SoapFilter CreateServiceInputFilter(FilterCreationContext context)
                {
                    // we don't provide any processing for web service side
                    return null;
                }

                public override SoapFilter CreateServiceOutputFilter(FilterCreationContext context)
                {
                    // we don't provide any processing for web service side
                    return null;
                }

                #region ClientOutputFilter
                class ClientOutputFilter : SendSecurityFilter
                {
                    public ClientOutputFilter(UTClientAssertion parentAssertion, FilterCreationContext context)
                        : base(parentAssertion.ServiceActor, false, parentAssertion.ClientActor)
                    {
                    }

                    public override void SecureMessage(SoapEnvelope envelope, Security security)
                    {
                        UsernameToken token = new UsernameToken("UserName", "Password", PasswordOption.SendPlainText);
                        security.Tokens.Add(token);
                        security.MustUnderstand = false;
                    }
                }
                #endregion

这些类应用到客户端中生成的代理类如下:

                // Create the web service client
                ListService objListSvc = new ListService();

                //code to set up the security policy and user assertion
                UTClientAssertion objAssertion = new UTClientAssertion();

                // create policy, add the assertion, and set it on the web service
                Policy objPolicy = new Policy();
                objPolicy.Assertions.Add(objAssertion);
                objListSvc.SetPolicy(objPolicy);

我发现,如果我编辑 WSE 客户端代码以删除 objListSvc.SetPolicy(objPolicy) 行,我会收到相同的错误消息“缺少必需的参数值”。

与上面配置此 Web 服务的用户名和密码的 WSE 代码匹配的等效 WCF 配置/代码是什么?正在使用的 WCF 配置是生成的默认配置:

        <basicHttpBinding>
            <binding name="ListBinding" closeTimeout="00:01:00"
                openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
                useDefaultWebProxy="true">
                <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                    maxBytesPerRead="4096" maxNameTableCharCount="16384" />
              <security mode="Transport">
                <transport clientCredentialType="None" proxyCredentialType="None"
                    realm="" />
                <message clientCredentialType="UserName" algorithmSuite="Default" />
              </security>
            </binding>
        </basicHttpBinding>

提前致谢

【问题讨论】:

    标签: c# wcf wse


    【解决方案1】:

    如果没有来自 WSE3 的 SOAP 消息在网络上的外观示例,就很难判断。尝试通过 Fiddler 获取并在此处发布。

    一般如果您使用 SSL,请尝试以下操作:

    <bindings>
            <basicHttpBinding>
                <binding name="NewBinding0">
                    <security mode="TransportWithMessageCredential " />
                </binding>
            </basicHttpBinding>
    </bindings>
    

    如果你不使用 ssl try CUB.

    【讨论】:

    • 感谢您的回复。在上面的帖子中,我没有看到关于 SSL 的句子后面列出的任何内容。我正在使用 SSL,所以我有兴趣查看该建议。我想使用 fiddler 或 tcpmon 来查看正在传输的数据,但我在一个安全的环境中工作,我们无法从互联网上下载任何东西,而且我无法使用这些工具。我试图在 WSE 应用程序中打开诊断跟踪,但这导致在上面我创建 UsernameToken 的新实例的代码行上出现空指针异常,只需添加诊断即可。
    • 谢谢 - 它现在发布。我更改了我的 WCF 客户端以使用此绑定,但结果是 InvalidOperationException 并显示消息“BasicHttp 绑定要求 BasicHttpBinding.Security.Message.ClientCredentialType 等效于安全消息的 BasicHttpMessageCredentialType.Certificate 凭据类型。选择 Transport 或 TransportWithMessageCredential security for用户名凭据”
    • 这会导致 MessageSecurityException 并显示消息“从另一方收到不安全或不正确安全的故障。有关故障代码和详细信息,请参阅内部 FaultException。” & 内部异常是带有消息“[ISS.0088.9117] SOAP 处理器不理解一个或多个标头条目”的 FaultException。知道上面对 SetPolicy() 的调用在发送的消息中发生了什么变化吗?再次感谢
    • 在这种情况下,请发布工作 SOAP 和失败 SOAP 的样本(例如最后一个)。然后我们可以看到究竟缺少什么。使用 fiddler 之类的来获取它
    • 很遗憾,我在一个安全的环境中工作,我们无法从互联网上下载任何东西,并且我无法使用 fiddler、tcpmon 等
    猜你喜欢
    • 1970-01-01
    • 2011-04-05
    • 2012-05-22
    • 1970-01-01
    • 1970-01-01
    • 2019-08-25
    • 2010-11-17
    • 2020-12-04
    • 1970-01-01
    相关资源
    最近更新 更多