WCF генерирует объект аутентификации OASIS - PullRequest
0 голосов
/ 30 января 2019

Я пытаюсь вызвать SOAP с помощью функции «добавить serviceReference» в Visual Studio.Метод аутентификации SOAP должен выполняться с использованием OASIS.Заголовок должен выглядеть примерно так:

  <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>

Все классы создаются успешно без классов UsernameToken и Security, которые необходимо добавить вручную.

var UsernameToken = new UsernameToken{ Username = userName, Password = password, Nonce = nonce, Created = created };

Я добавляю Security в заголовок, используяследующий код:

Security security = new Security { UsernameToken =UsernameToken  }; 
System.ServiceModel.Channels.MessageHeader messageHeader = 
System.ServiceModel.Channels.MessageHeader.CreateHeader(name: "Security", 
ns: "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity- 
secext-1.0.xsd", value: security, mustUnderstand: true);

Моя проблема заключается в том, что выходное пространство имен для объекта, созданного вручную, неверно.Вот сгенерированный запрос

  <UsernameToken
xmlns="http://schemas.datacontract.org/2004/07/ProjectName.UnitTesting"> //This is not the correct namespace
<Created>2019-01-21T06:42:15Z</Created>
<Nonce>NzUyZg==</Nonce>
<Password>MonUserName=</Password>
<Username>MonPassword</Username>

Я хочу установить для пространства имен usernameToken значение

 xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"

вместо

"http://schemas.datacontract.org/2004/07/ProjectName.UnitTesting"

Я пыталсядобавьте атрибут

[XmlAttribute(Namespace = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd")]

и все еще сталкиваетесь с той же проблемой.Я также сталкиваюсь с той же проблемой с атрибутом serviceContract.Спасибо,

1 Ответ

0 голосов
/ 30 января 2019

Один из способов - использовать XmlElemnt для добавления префикса, другой способ - добавить заголовок в web.config или app.config.

Ниже описано, как писать код, добавьте свой собственный заголовок.

     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);


                OperationContext.Current.OutgoingMessageHeaders.Add(messageHeader);
                employeeService.Add(5, 6);
            }

                           Console.Read();
        }

Вы также можете добавить в app.config или web.config.

<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>

Результат.

enter image description here

Что касается записи в app.config, если вы не хотите появляться, поместите все заголовки в одну строку, просто я публикую в своем app.config.

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