Autorisation: Base de client pour le Service SOAP

L'application SoapUI j'ai mis un mot de passe et nom d'utilisateur pour le point de terminaison. Lorsque vous appelez la méthode, ces données ne sont pas transmises dans l'en-tête de message, mais en dehors d'elle (Authorization: Basic YTph). Toutefois, dans ce cas, l'appel est authentifié avec succès. Si j'essaie d'ajouter les données d'authentification dans l'en-tête dans mon application client c#, le service de ne pas voir les noms d'utilisateur.

SoapUI:

POST https://xxx.xx:9444/xx HTTP/1.1
Accept-Encoding: gzip,deflate
Content-Type: text/xml;charset=UTF-8
SOAPAction: ""
Authorization: Basic YTph
Content-Length: 470
Host: xx.loc:9444
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ami="http://xxx.pl">
   <soapenv:Header/>
   <soapenv:Body>
      <ami:getMeterPointStates>
      <addr>
          <ppec>0</ppec>
          <mid>0</mid>
        </addr>
        <start>2012-04-01T00:00:00</start>
        <stop>2012-05-01T00:00:00</stop>
        <hard>false</hard>
      </ami:getMeterPointStates>
   </soapenv:Body>
</soapenv:Envelope>

Client C# samle code:

System.Net.ServicePointManager.ServerCertificateValidationCallback += new System.Net.Security.RemoteCertificateValidationCallback(RemoteCertValidate);
CommunicationWebserviceClient client = new CommunicationWebserviceClient();

client.ClientCredentials.UserName.UserName = "user";
client.ClientCredentials.UserName.Password = "password";

using (new System.ServiceModel.OperationContextScope(client.InnerChannel))
{
    MessageHeader head = MessageHeader.CreateHeader("Authorization", "http://xxx.pl", "Basic YTph");
    OperationContext.Current.OutgoingMessageHeaders.Add(head);

    MeterPointAddr addr = new MeterPointAddr();
    addr.ppec = "0";
    addr.mid = "0";

    var response = client.getMeterPointStates(addr, new DateTime(2012, 4, 1), new DateTime(2012, 4, 14), false, "", measurementsFlagEnum.REAL_ESTIMATION);
}

App.config:

 <bindings>
    <customBinding>
        <binding name="CommunicationWebservicePortBinding">
            <textMessageEncoding messageVersion="Soap11" />

            <httpsTransport authenticationScheme="Basic" />
        </binding>
    </customBinding>
</bindings>
<client>
    <endpoint address="https://xxx.xx:9444/xx"
        binding="customBinding" bindingConfiguration="CommunicationWebservicePortBinding" contract="AMIService.CommunicationWebservice"
        name="CommunicationWebservicePort" />
</client>

Comment puis-je ajouter un client écrit en c # qui (Authorization: Basic YTph) de la tête?

  • Je suppose dans votre C# code client, vous n'avez pas besoin d'ajouter MessageHeader.CreateHeader("Authorization" ... ligne. Cette ligne est généré automatiquement lorsque vous définissez l'authentification de base et l'utilisation du nom d'utilisateur avec mot de passe. Le YTph est efficacement votre nom d'utilisateur et le mot de passe codé en base 64. Assurez-vous d'utiliser SSL si c'est le code de production.
  • Il a travaillé pour moi. stackoverflow.com/questions/20495105/... un exemple de code.
InformationsquelleAutor Emil J | 2014-01-15