Добавить защиту заголовка конечной точки WCF программно - PullRequest
4 голосов
/ 23 сентября 2011

У меня есть этот файл web.config для настройки клиентского прокси-сервера из внешней службы, эта служба требует проверки подлинности в заголовке сообщения, у меня есть служба, хорошо настроенная в моем web.config, но сейчас я пытаюсь создать прокси с этой конфигурацией в коде, с предложением динамически изменить пользователя и пароль.

<cliente>
    <endpoint address="https://wwwww.hhhahdhadhs.askadadasda" binding="basicHttpBinding" bindingConfiguration="MyConfiguration" contract="PROXY_ACSS_SERVICES.RegistoPrescricaoMedicamentos">
            <headers>
              <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
                <wsse:UsernameToken>
                  <wsse:Username>MyUser</wsse:Username>
                  <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">87726655434</wsse:Password>
                </wsse:UsernameToken>
              </wsse:Security>
            </headers>
          </endpoint>
</cliente>

<basicHttpBinding>
<binding name="PrescricaoMedicamentos" 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="Certificate" algorithmSuite="Default" />
          </security>
        </binding>
</basicHttpBinding>

Моя проблема - создать заголовок, в котором определены имя пользователя и пароль,

<headers>


   <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
            <wsse:UsernameToken>
              <wsse:Username>MyUser</wsse:Username>
              <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">87726655434</wsse:Password>
            </wsse:UsernameToken>
          </wsse:Security>
        </headers>  

Заранее спасибо

РЕДАКТИРОВАТЬ

Ладислав Мрнка после того, как я создаю прокси, программно получаю это сообщение

'Тайм-аут канала запроса при попытке отправить после 00: 00: 59,9829990. Увеличьте значение тайм-аута, переданное вызову Запрос или увеличение значения SendTimeout в привязке. Время выделенный на эту операцию, возможно, был частью более длительного Тайм-аут ".

Это моя конфигурация прокси

   BasicHttpBinding binding = new BasicHttpBinding(BasicHttpSecurityMode.TransportWithMessageCredential);
            binding.Name = "PrescricaoMedicamentos";
            binding.CloseTimeout = new TimeSpan(0, 1, 0);
            binding.OpenTimeout = new TimeSpan(0, 1, 0);
            binding.ReceiveTimeout = new TimeSpan(0, 10, 0);
            binding.SendTimeout = new TimeSpan(0, 1, 0);
            binding.AllowCookies = false;
            binding.BypassProxyOnLocal = false;
            binding.HostNameComparisonMode = HostNameComparisonMode.StrongWildcard;
            binding.MaxBufferSize = 65536;
            binding.MaxBufferPoolSize = 524288;
            binding.MaxReceivedMessageSize = 65536;
            binding.MessageEncoding = WSMessageEncoding.Text;
            binding.TextEncoding = System.Text.Encoding.UTF8;
            binding.TransferMode = TransferMode.Buffered;
            binding.UseDefaultWebProxy = true;
            binding.ReaderQuotas = new XmlDictionaryReaderQuotas()
                                       {
                                           MaxDepth = 32,
                                           MaxStringContentLength = 8192,
                                           MaxArrayLength = 16384,
                                           MaxBytesPerRead = 4096,
                                           MaxNameTableCharCount = 16384
                                       };

            binding.Security.Message.ClientCredentialType = BasicHttpMessageCredentialType.UserName; 


            return binding;

}

Мне интересно, возможно ли добавить статический заголовок ко всем сообщениям в коде ... Что-то вроде AddressHeader.CreateAddressHeader («заголовок аутентификации») и применить эти заголовки к моей конфигурации EndpointAddress. Такой подход заменит буквально мой первый код

<headers>
          <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
            <wsse:UsernameToken>
              <wsse:Username>myusername</wsse:Username>
              <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">mypass</wsse:Password>
            </wsse:UsernameToken>
          </wsse:Security>
        </headers>

1 Ответ

0 голосов
/ 23 сентября 2011

Если служба правильно реализует профиль токена имени пользователя, измените параметры безопасности в вашей привязке на:

<security mode="TransportWithMessageCredential">
    <message clientCredentialType="UserName" />
</security>

И после того, как вы создадите учетные данные для прокси-сервера, набрав:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...