Добавление SOAP: имя пользователя и пароль HEADER с WSE 3.0 - PullRequest
8 голосов
/ 26 января 2010

Я успешно создал клиент WS, который работает правильно, если НЕ использовать аутентификацию.

Однако сервер (WebSphere) теперь требует добавления токена имени пользователя ws-security, и мне трудно это сделать. Полученное SOAP-сообщение должно выглядеть примерно так:

<soapenv:Envelope 
  xmlns:ns="http://foo.bar/1.0"
  xmlns:ns1="http://www.witsml.org/schemas/140"   
  xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">

  <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-2" 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">foooooobar==</wsse:Nonce>
        <wsu:Created>2010-01-25T13:09:24.860Z</wsu:Created>
      </wsse:UsernameToken>
    </wsse:Security>

  </soapenv:Header>

  <soapenv:Body>
    <ns:fooBar>...</ns:fooBar>
  </soapenv:Body>

Я скачал и установил Microsoft WSE 3.0 SDK и добавил ссылку на DLL в моем проекте Visual Studio 2005.

Теперь у меня есть доступ к пространствам имен Microsoft.Web.Services3. *, Но я в настоящее время озадачен тем, как действовать.

Код клиента был сгенерирован автоматически с помощью веб-ссылки, поэтому я отправляю сообщение на сервер только небольшую часть работы без аутентификации :

WS.FooResultHttpService ws = new WS.FooResultHttpService();
ws.Url = "http://foo.bar.baz";
ws.SendSomething(message);

Я только начал исследовать, используя Microsoft.Web.Services3.Security.Tokens.UsernameTokenManager, но до сих пор я не смог ничего запустить и запустить.

Будем весьма благодарны за любые подсказки, поскольку я не могу найти хороших рецептов в сети.

Спасибо!

Ответы [ 2 ]

14 голосов
/ 26 января 2010

Убедитесь, что ваш прокси-класс наследуется от Microsoft.Web.Services3.WebServicesClientProtocol.

Это можно сделать, либо изменив сам прокси-класс, либо сгенерировав его с помощью командной строки, используя wsewsdl3.exe с переключателем /type:webClient.

Затем вы можете передать учетные данные следующим образом:

using Microsoft.Web.Services3;
using Microsoft.Web.Services3.Security.Tokens;
using Microsoft.Web.Services3.Security;
.
.
.
WS.FooResultHttpService ws = new WS.FooResultHttpService();
ws.RequestSoapContext.Security.Tokens.Add(new UsernameToken("blah", "blah", PasswordOption.SendPlainText));

Это то, что я делал в прошлом, чтобы запустить WSE3.0 в Studio 2008. Надеюсь, это поможет.

11 голосов
/ 26 января 2010

Работает, к сожалению, перед прочтением Великолепного ответа wsanville .

Чтобы помочь другим, я публикую все шаги, необходимые для работы с Visual Studio 2005:

  • Установить WSE 3.0 , выбрать custom и выбрать все
  • Чтение Реализация прямой аутентификации с токеном имени пользователя в WSE 3.0 для подсказок
  • Перезапустите Visual Studio 2005, теперь щелкните правой кнопкой мыши свой проект в обозревателе решений, и у вас должен появиться пункт меню WSE Settings 3.0 и используйте его, если хотите.
  • Обновите ваши веб-ссылки, это должно создать новый прокси-класс веб-службы HTTP с другим именем, например, YourWsNameHttpServiceWse. По сути это то же самое, что и запуск wsewsdl3.exe
  • Используйте этот новый класс, и у вас должен быть доступ к методам и свойствам WSE, таким как SetClientCredential.

Я закончил тем, что делал почти все в коде, вместо того, чтобы полагаться на файлы конфигурации, которые созданы с моей C # DLL. Код в итоге выглядел так:

FooBarHttpServiceWse wse = new FooBarHttpServiceWse();

wse.SetClientCredential(new UsernameToken(
    "username",
    "password",
    PasswordOption.SendPlainText));

wse.SetPolicy(new FooBarPolicy());
wse.CallSomeServerFunction(yourRequest)

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

using Microsoft.Web.Services3.Design;

// ...

public class FooBarPolicy : Policy
{
    public FooBarPolicy()
    {
        this.Assertions.Add(new UsernameOverTransportAssertion());
    }
}

Наконец, сервер WebSphere ответил, что Требуемый заголовок, представляющий свойство адресации сообщения, отсутствует , и проверяя исходящее сообщение (используя симпатичный инструмент Fiddler ), я увидел SOAP ошибка сервера указала, что заголовок Action отсутствует.

Я тщетно пытался установить элемент wsa:Action сам:

using Microsoft.Web.Services3.Addressing;

// ...

wse.RequestSoapContext.Addressing.Action = new Action("CallSomeServerFunction");

Проблема заключалась в том, что даже если я установил действие, когда оно было отправлено по проводам, оно было пустым. Оказалось, мне пришлось открыть прокси-класс WSE и отредактировать там атрибут:

[System.Web.Services.Protocols.SoapDocumentMethodAttribute(
    "---Edit this to set wsa:Action---", 
    Use=System.Web.Services.Description.SoapBindingUse.Literal, 
    ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Bare)]
// ...
public SomeServerFunction(...)

После этого все получилось.

...