Вопрос по c#, web-services, soapheader, authentication, cxf – Проверка подлинности клиента .NET и заголовки учетных данных SOAP для веб-службы CXF

4

SCENARIO

Я должен получить доступ к веб-сервису с помощью клиента .NET. Служба является веб-службой Apache CXF. Требуется аутентификация имени пользователя и пароля. Я создал прокси. Я установил полномочия.

MyServiceReference proxy = new MyServiceReference();
proxy.Credentials = new NetworkCredential("username", "password");
string res = proxy.Method1();

Когда я запускаю клиент, выдается следующее исключение:

System.Web.Services.Protocols.SoapHeaderException: An error was discovered processing the <wsse:Security> header

Издатель службы сказал мне, что учетные данные отсутствуют в заголовках SOAP. Итак, я думаю, чтоIWebProxy.Credentials неверный способ настройки аутентификации.

QUESTION

Итак, как я могу установить заголовок SOAP, необходимый для аутентификации?

Ваш Ответ

1   ответ
5

В конце концов мне пришлось вызвать службу, создав целое сообщение SOAP и сделавHttpWebRequest, В сообщении SOAP я вручную указываю заголовок безопасности:

<soapenv:Header>
  <wsse:Security soapenv:mustUnderstand='1' xmlns:wsse='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd'>
     <wsse:UsernameToken wsu:Id='UsernameToken-1' xmlns:wsu='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd'>
        <wsse:Username>Foo</wsse:Username>
        <wsse:Password Type='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText'>Bar</wsse:Password>
        <wsse:Nonce EncodingType='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary'>qM6iT8jkQalTDfg/TwBUmA==</wsse:Nonce>
        <wsu:Created>2012-06-28T15:49:09.497Z</wsu:Created>
     </wsse:UsernameToken>
  </wsse:Security>
</soapenv:Header>

А вот и сервисный клиент:

String Uri = "http://web.service.end.point"
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(Uri);
req.Headers.Add("SOAPAction", "\"http://tempuri.org/Register\"");
req.ContentType = "text/xml;charset=\"utf-8\"";
req.Accept = "text/xml";
req.Method = "POST";

String SoapMessage = "MySoapMessage, including envelope, header and body"
using (Stream stm = req.GetRequestStream())
{
    using (StreamWriter stmw = new StreamWriter(stm))
    {
        stmw.Write(SoapMessage);
    }
}


try
{
    WebResponse response = req.GetResponse();
    StreamReader sr = new StreamReader(response.GetResponseStream());
    log.InfoFormat("SoapResponse: {0}", sr.ReadToEnd());
}
catch(Exception ex)
{
    log.Error(Ex.ToString());
}

Интересные ресурсы о безопасности веб-служб (WSS):

Похожие вопросы