Добавление защиты заголовка конечной точки WCF программным путем

У меня есть этот файл 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. Увеличьте значение тайм-аута, передаваемое вызову Request, или увеличьте значение 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>

person mastervv    schedule 23.09.2011    source источник


Ответы (1)


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

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

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

proxy.ClientCredentials.UserName.UserName = ...;
proxy.ClientCredentials.UserName.Password = ...;
person Ladislav Mrnka    schedule 23.09.2011
comment
Я попытался использовать ваше предложение, однако при попытке подключения к службе мое клиентское приложение получило это исключение «Процессор безопасности не смог найти заголовок безопасности в сообщении». Это может быть связано с тем, что сообщение является незащищенным сбоем, или с несоответствием привязки между взаимодействующими сторонами. Это может произойти, если служба настроена на безопасность, а клиент не использует безопасность». Можете ли вы помочь мне с этим!? Спасибо - person mastervv; 26.09.2011
comment
Включите ведение журнала сообщений и проверьте, что возвращает служба. Это либо ошибка, либо сообщение без метки времени. - person Ladislav Mrnka; 26.09.2011