如何在使用SSL加密的标头中使用用户名/密码调试WCF客户端

时间:2011-12-09 02:42:06

标签: wcf wcf-security

我仍在努力让WCF与CXF交谈。我使用了来自http://rocksolidknowledge.com/Download.mvc的示例,它看起来像代码一样,因为当我更改客户端中的用户名时,我会看到服务中的新用户名。

我尝试在客户端app.config中添加日志记录,以保存发送给服务的内容。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.serviceModel>
        <bindings>
            <wsHttpBinding>
              <binding name="WSHttpBinding_Av1Service" closeTimeout="00:01:00"
                  openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                  bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
                  maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                  messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
                  allowCookies="false">

                <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                      maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                <reliableSession ordered="true" inactivityTimeout="00:10:00"
                    enabled="false" />

                <security mode="TransportWithMessageCredential">
                        <transport clientCredentialType="None" proxyCredentialType="None"
                            realm="" />
                        <message clientCredentialType="UserName" negotiateServiceCredential="true"
                            algorithmSuite="Default" establishSecurityContext="true" />
                    </security>

                <!--
                <security mode="None">
                  <transport clientCredentialType="None" proxyCredentialType="None"
                      realm="" />
                  <message clientCredentialType="UserName" negotiateServiceCredential="true"
                      algorithmSuite="Default" establishSecurityContext="true" />
                </security>
                -->
              </binding>
            </wsHttpBinding>
        </bindings>
      <behaviors>
        <endpointBehaviors>

          <behavior name="client">
            <clientCredentials>
              <serviceCertificate>
                <authentication certificateValidationMode="None"/>
              </serviceCertificate>
            </clientCredentials>
          </behavior>
        </endpointBehaviors>
      </behaviors>
        <client>

            <endpoint address="https://darsdevlaptop:8015/DarsWebServices/services/av1" binding="wsHttpBinding"
                bindingConfiguration="WSHttpBinding_Av1Service" contract="Av1ServiceReference.Av1Service"
                name="WSHttpBinding_Av1Service" />

          <!--
            <endpoint 
              address="http://localhost:9015/DarsWebServices/services/av1" binding="wsHttpBinding"
                bindingConfiguration="WSHttpBinding_Av1Service" contract="Av1ServiceReference.Av1Service"
                name="WSHttpBinding_Av1Service" />
          -->
        </client>
      <diagnostics>
        <messageLogging logEntireMessage="true"
                        logMalformedMessages="true"
                        logMessagesAtServiceLevel="true"
                        logMessagesAtTransportLevel="true"
                        maxMessagesToLog="3000"
                        maxSizeOfMessageToLog="2000"/>
      </diagnostics>
    </system.serviceModel>
</configuration>

此配置生成一个client_msg.svclog文件,我可以使用Microsoft服务跟踪查看器查看该文件。在这个文件中我看到了

E2ETraceEvent xmlns="http://schemas.microsoft.com/2004/06/E2ETraceEvent">
<System xmlns="http://schemas.microsoft.com/2004/06/windows/eventlog/system">
<EventID>0</EventID>
<Type>3</Type>
<SubType Name="Information">0</SubType>
<Level>8</Level>
<TimeCreated SystemTime="2011-12-08T15:27:46.1360000Z" />
<Source Name="System.ServiceModel.MessageLogging" />
<Correlation ActivityID="{00000000-0000-0000-0000-000000000000}" />
<Execution ProcessName="Clieint.vshost" ProcessID="5660" ThreadID="10" />
<Channel />
<Computer>DARSDEVLAPTOP</Computer>
</System>
<ApplicationData>
<TraceData>
<DataItem>
<MessageLogTraceRecord Time="2011-12-08T10:27:46.1320000-05:00" Source="ServiceLevelSendRequest" Type="System.ServiceModel.Channels.BodyWriterMessage" xmlns="http://schemas.microsoft.com/2004/06/ServiceModel/Management/MessageTrace">
<HttpRequest>
<Method>POST</Method>
<QueryString></QueryString>
<WebHeaders>
<VsDebuggerCausalityData>uIDPo7bjbPmwsKdKqJIT7OFhvN8AAAAA+hhv3g5Q+UymaaUAoh1MoXMwGPaCPSlAoTQw7kFj3m8ACQAA</VsDebuggerCausalityData>
</WebHeaders>
</HttpRequest>
<s:Envelope xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:s="http://www.w3.org/2003/05/soap-envelope">
<s:Header>
<a:Action s:mustUnderstand="1">http://tempuri.org/IPing/Ping</a:Action>
<a:MessageID>urn:uuid:85d46f93-9798-41c4-a8fd-e862b3858d46</a:MessageID>
<a:ReplyTo>
<a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address>
</a:ReplyTo>
</s:Header>
<s:Body>
<Ping xmlns="http://tempuri.org/"></Ping>
</s:Body>
</s:Envelope>
</MessageLogTraceRecord>
</DataItem>
</TraceData>
</ApplicationData>

我很沮丧,没有找到任何用户名或密码的引用

<s:Header>
    <a:Action s:mustUnderstand="1">http://tempuri.org/IPing/Ping</a:Action>
    <a:MessageID>urn:uuid:85d46f93-9798-41c4-a8fd-e862b3858d46</a:MessageID>
    <a:ReplyTo>
        <a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address>
    </a:ReplyTo>
</s:Header>

我也试过运行fiddler2,但我也没有看到任何用户名/密码。 那么发生了什么?我错过了如何使用视图工具?是不是在标题中传递了?如果是这样,我该如何解决这个问题!

只是为了解释为什么我关心这个:

  • 我根据示例将代码提供给了我的客户,以便与CXF进行交流 服务和我收到的报告是用户名/密码 没有通过。
  • 我实际上无法调试通信,因为我似乎无法 让WCF从CXF获取测试证书。
  • WCF到WCF的一切都运行良好,但这不是客户的意思 需求。

我感到非常难过。谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

我没有看到诊断源被设置。比如这个。

<system.diagnostics>
  <sources>
      <source name="System.ServiceModel.MessageLogging">
        <listeners>
                 <add name="messages"
                 type="System.Diagnostics.XmlWriterTraceListener"
                 initializeData="c:\logs\messages.svclog" />
          </listeners>
      </source>
    </sources>
</system.diagnostics>

我希望你看过这个msdn article.