2017-06-21 42 views
0

在我的桌面应用程序(C#,WPF,WCF,.NET4.0)中,我添加了一个服务引用。C#WCF服务参考 - 无法创建UserNameToken

这是在Soap Envelope Header中使用证书和UserNameToken的Web服务(SOAP)。

我使用此Web服务的WSDL添加服务引用(解决方案 - >服务引用 - >添加服务引用)。 在我的app.config我有:

<customBinding> 
<binding name="tmsIntegrationServiceSOAP"> 
      <!-- WsdlImporter encountered unrecognized policy assertions in ServiceDescription 'urn:CDM/tmsIntegrationService/': --> 
      <!-- <wsdl:binding name='tmsIntegrationServiceSOAP'> --> 
      <!--  <sp:SupportingTokens xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">..</sp:SupportingTokens> --> 
      <mtomMessageEncoding messageVersion="Soap11" /> 
      <httpsTransport /> 
     </binding> 
     </customBinding> 

<endpoint address="https://XXX/CDM/tmsIntegrationService" 
     binding="customBinding" bindingConfiguration="tmsIntegrationServiceSOAP" 
     contract="RABEN.GS1.tmsIntegrationService" name="tmsIntegrationServiceSOAP" /> 

我传递的用户名和密码这样的:

var ssc = new GS1.tmsIntegrationServiceClient(); 
ssc.ClientCredentials.UserName.UserName = "test"; 
ssc.ClientCredentials.UserName.Password = "testPassword"; 
ssc.Endpoint.Behaviors.Add(new InspectorBehavior()); 

当我请求XML(有消息检查),我看到有在SOAP头没有的UserNameToken

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> 
    <s:Header> 
    <Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">urn:CDM/tmsIntegrationService/importTransportInstruction</Action> 
    <VsDebuggerCausalityData xmlns="http://schemas.microsoft.com/vstudio/diagnostics/servicemodelsink">uIDPoy3hcoBMqQ5Kme7yqEiHKs0AAAAAyxy+QnWD8U60kqJZWaGfvYD8RN14nUVIjC0RuEyVBa8ACQAA</VsDebuggerCausalityData> 
    </s:Header> 
    <s:Body ... 

我尝试用户basicHttpBinding的:

<binding name="secured"> 
      <security mode="TransportWithMessageCredential"> 
      <transport clientCredentialType="None" /> 
      <message clientCredentialType="UserName" /> 
      </security> 
     </binding> 

<endpoint address="https://XXX/CDM/tmsIntegrationService" 
     binding="basicHttpBinding" bindingConfiguration="secured" contract="RABEN.GS1.tmsIntegrationService" 
     name="tmsIntegrationServiceSOAP" /> 

结束结果:

<s:Header> 
    <Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">urn:CDM/tmsIntegrationService/importTransportInstruction</Action> 
    </s:Header> 

当我尝试使用的wsHttpBinding:

<wsHttpBinding> 
     <binding name="RabenBinding"> 
      <security mode="TransportWithMessageCredential"> 
      <message clientCredentialType="UserName" /> 
      </security> 
     </binding> 
     </wsHttpBinding> 

<endpoint address="https://XXX/CDM/tmsIntegrationService" 
     binding="wsHttpBinding" bindingConfiguration="RabenBinding" 
     contract="RABEN.GS1.tmsIntegrationService" name="tmsIntegrationServiceSOAP" /> 

结果:

<s:Header> 
    <a:Action s:mustUnderstand="1">urn:CDM/tmsIntegrationService/importTransportInstruction</a:Action> 
    <a:MessageID>urn:uuid:701a0fff-c4aa-4f37-a299-ec6d272e51e7</a:MessageID> 
    <a:ReplyTo> 
     <a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address> 
    </a:ReplyTo> 
    </s:Header> 

能有人告诉我,我做错了什么?

编辑 - 2017年6月21日20:00 的证书安装我的本地机器

<behaviors> 
     <endpointBehaviors> 
     <behavior name="RabenBehavior"> 
      <clientCredentials> 
      <clientCertificate findValue="this is footprint of certificate" 
       storeLocation="CurrentUser" storeName="My" x509FindType="FindByThumbprint" /> 
      </clientCredentials> 
     </behavior> 
     </endpointBehaviors> 
    </behaviors> 

我在端点安装此behavion上:

<endpoint address="https://XXX/CDM/tmsIntegrationService" 
     behaviorConfiguration="RabenBehavior" binding="wsHttpBinding" 
     bindingConfiguration="RabenBinding" contract="RABEN.GS1.tmsIntegrationService" 
     name="tmsIntegrationServiceSOAP" /> 

编辑2017-06 -21 20:58 我尝试使用<mtomMessageEncoding messageVersion="Soap11" />

<binding name="myCustomBindingConfig"> 
      <security defaultAlgorithmSuite="Default" 
        authenticationMode="UserNameOverTransport" 
      requireDerivedKeys="true" 
      includeTimestamp="false" messageSecurityVersion="WSSecurity10WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10" /> 
      <mtomMessageEncoding messageVersion="Soap11" /> 
      <httpsTransport maxReceivedMessageSize="2000000000" /> 
     </binding> 

但是头还是不containt用户名令牌

<s:Header> 
    <Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">urn:CDM/tmsIntegrationService/importTransportInstruction</Action> 
    <VsDebuggerCausalityData xmlns="http://schemas.microsoft.com/vstudio/diagnostics/servicemodelsink">uIDPo0OlG2DVOLdKniJmYU2kvwUAAAAAujMM+x53aEWJYYd4GKyk+PlCKXIih9xLrE0V5TayKhQACQAA</VsDebuggerCausalityData> 
    </s:Header> 

EDIT 2017年6月21日21:36 尝试通过VS

使用 <textMessageEncoding messageVersion="Soap11" />在自定义绑定generatet
<binding name="tmsIntegrationServiceSOAP"> 
      <!-- WsdlImporter encountered unrecognized policy assertions in ServiceDescription 'urn:CDM/tmsIntegrationService/': --> 
      <!-- <wsdl:binding name='tmsIntegrationServiceSOAP'> --> 
      <!--  <sp:SupportingTokens xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">..</sp:SupportingTokens> --> 
      <textMessageEncoding messageVersion="Soap11" /> 
      <httpsTransport /> 
     </binding> 

但它带来了不效果 - 没有用户名令牌请求XML:

<s:Header> 
    <Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">urn:CDM/tmsIntegrationService/importTransportInstruction</Action> 
    <VsDebuggerCausalityData xmlns="http://schemas.microsoft.com/vstudio/diagnostics/servicemodelsink">uIDPo0wJNixU4QRBhGEUAC3pw50AAAAA/fPJ+e50KUSGbYXwcmoGwgqymCvLXJZIhKg/nKdV97cACQAA</VsDebuggerCausalityData> 
    </s:Header> 
+0

您是否尝试过使用在你的自定义绑定中使用'而不是''? – bnem

+0

我试试这个(编辑编辑2017-06-21 20:58) – pejoter

+0

你的编辑仍然包含mtomMessageEncoding – bnem

回答

0

,但如果你通过点击Solution Explorer附加服务添加是指发生了什么那么,它告诉你什么?或者你没有这个选项。

+0

我编辑问题更加清楚:我使用此Web服务的WSDL添加服务引用(解决方案 - >服务引用 - >添加服务引用)。添加服务引用 – pejoter

+1

时没有错误,并且要求接受您的请求证书并输入用户名和密码,如果答案是肯定的,你可以在没有任何其他的情况下将其实例化。对不起,我的英文 –

+0

检查这个https://blogs.msdn.microsoft.com/mcsuksoldev/2011/07/05/using-相互-SSL-和信息安全到安全-A-WCF服务/ –

0

要修改SOAP标题,您需要实现IClientMessageInspector 界面。要做到这一点创建新类MessageInspector并添加 三个嵌套在它下面的类:

public class CustomMessageHeader : MessageHeader 
     { 
      private const string NAMESPACE_SECURITY = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"; 
      public CustomMessageHeader() 
      { 
      } 
      public override string Name 
      { 
       get { return "wsse:Security"; } 
      } 
      public override string Namespace 
      { 
       get { return ""; } 
      } 
      protected override void OnWriteHeaderContents(XmlDictionaryWriter writer, MessageVersion messageVersion) 
      { 
       writer.WriteAttributeString("xmlns", "wsse", null, NAMESPACE_SECURITY); 
       writer.WriteStartElement("wsse:UsernameToken"); 
       writer.WriteElementString("wsse:Username", "YOUR_USERNAME"); 
       writer.WriteElementString("wsse:Password", "YOUR_PASSWORD"); 
       writer.WriteEndElement(); 
      } 
     } 
public class ClientMessageInspector : IClientMessageInspector 
     { 
      public object BeforeSendRequest(ref Message request, IClientChannel channel) 
      { 
       CustomMessageHeader header = new CustomMessageHeader(); 
       request.Headers.RemoveAt(0); 
       request.Headers.Add(header); 
       return request; 
      } 
public void AfterReceiveReply(ref System.ServiceModel.Channels.Message reply, object correlationState) 
      { 
      } 
     } 
public class CustomEndpointBehavior : IEndpointBehavior 
     { 
public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime) 
      { 
       clientRuntime.ClientMessageInspectors.Add(new ClientMessageInspector()); 
      } 
public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters) 
      { 
      } 

      public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher) 
      { 
      } 

      public void Validate(ServiceEndpoint endpoint) 
      { 
      } 
} 

要触发这个类中调用,在主类中添加新的终结点行为

serviceClient.Endpoint.EndpointBehaviors.Add(new CustomEndpointBehavior());