WCF FaultCode MustUnderstand = 1 .net 4.0 - PullRequest
0 голосов
/ 04 марта 2019

Как мне изменить службу wcf, чтобы она могла принимать mustunderstand = 1?Это сценарий, в котором я должен изменить службу, чтобы иметь возможность принимать запрос от клиента.Клиент отправляет mustunderstand = 1 в заголовке.

Служба настроена на использование basichttpBinding

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

Использование интерфейса пользователя soap Я вставляю следующий токен имени пользователя в заголовок

 <wsse:Security soapenv:mustUnderstand="1" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
         <wsse:UsernameToken wsu:Id="UsernameToken-2684C13EA73A35131015516775308851">
            <wsse:Username>username</wsse:Username>
            <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">password</wsse:Password>

         </wsse:UsernameToken>
      </wsse:Security>

Я могу воспроизвести проблему на soapПользовательский интерфейс, когда я вставляю этот токен в запрос службы wcf.Это ошибка

<FaultMsgRec>
  <ErrCode>100</ErrCode>
  <ErrCat>Error</ErrCat>
  <ErrDesc>An unsecured or incorrectly secured fault was received from the other party. See the inner FaultException for the fault code and detail.--&gt; The header 'Security' from the namespace 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd' was not understood by the recipient of this message, causing the message to not be processed.  This error typically indicates that the sender of this message has enabled a communication protocol that the receiver cannot process.  Please ensure that the configuration of the client's binding is consistent with the service's binding. </ErrDesc>
</FaultMsgRec>

Поскольку у меня есть контроль над службой wcf, я могу пойти и добавить ValidateMustUnderstand = false в поведении службы.Точно так же, как это объяснено в ссылке https://docs.microsoft.com/en-us/dotnet/api/system.servicemodel.description.mustunderstandbehavior.validatemustunderstand?view=netframework-4.7.2

Как только я добавлю это к поведению службы, ошибка исчезнет.Но я не хочу отключать проверку заголовка, особенно если это имя пользователя, пароль.Что я должен сделать, чтобы позволить mustunderstand = 1?Я что-то упускаю из-за того, что служба автоматически не обрабатывает mustunderstand = 1 по умолчанию.Я знаю, что на клиенте должен быть написан код для отправки 0 в заголовке.

Я использую контракты сообщений в моем сервисе wcf, а не контракт данных.Я понимаю, что для определенных свойств я могу пойти и добавить такие атрибуты, как эта ссылка https://docs.microsoft.com/en-us/dotnet/api/system.servicemodel.messageheaderattribute.mustunderstand?view=netframework-4.7.2. Но я не добавляю никаких свойств.Я просто добавляю его на первый линк в soapenv: mustunderstand = 1

Пожалуйста, помогите !.

Спасибо

1 Ответ

0 голосов
/ 04 марта 2019

Не уверен, может ли это решить вашу проблему.Но вы можете попробовать добавить свой заголовок в web.config.

  <endpoint address="http://ws-wuxipc-5077:4000/calculator" binding="basicHttpBinding"
  contract="ServiceInterface.ICalculatorService" name="cal">
  <headers>
    <Security xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" >
      <wsse:UsernameToken xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
        xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
        <wsse:Username>
        </wsse:Username>
        <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">monMonDePasse</wsse:Password>
        <wsse:Nonce>sdsdsdlojhfdsdM5Nw==</wsse:Nonce>
        <wsu:Created>2019-01-21T6:17:34Z</wsu:Created>
      </wsse:UsernameToken>
    </Security>
  </headers>
</endpoint>

Или вы можете добавить заголовок, используя код.

 using (ChannelFactory<ICalculatorService> ChannelFactory = new ChannelFactory<ICalculatorService>("cal"))
    {
                        ICalculatorService employeeService = ChannelFactory.CreateChannel();
        using (OperationContextScope scope = new OperationContextScope((IContextChannel)employeeService))
        {

            System.Xml.XmlDocument document = new XmlDocument();


            XmlElement element = document.CreateElement("wsse", "UsernameToken", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");


            XmlElement newChild = null;

            newChild = document.CreateElement("wsse", "Username", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");
            newChild.InnerText = "finance";
            element.AppendChild(newChild);

            newChild = document.CreateElement("wsse", "password", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");
            newChild.SetAttribute("Type", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest");
            newChild.InnerText = "387";
            element.AppendChild(newChild);

            MessageHeader messageHeader = MessageHeader.CreateHeader("security", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", element, false); // here is mustunderstood is set to false


            OperationContext.Current.OutgoingMessageHeaders.Add(messageHeader);

        }

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