Добавление имени пользователя SOAP:HEADER и пароля с WSE 3.0

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

Однако сервер (WebSphere) теперь требует добавления маркера имени пользователя ws-безопасности, и мне нелегко делать это. Получающееся сообщение 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>

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

У меня теперь есть доступ к Microsoft. Сеть. Services3.* пространства имен, но я в настоящее время озадачиваюсь о том, как продолжить двигаться.

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

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

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

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

Спасибо!

8
задан Langdon 4 February 2010 в 14:18
поделиться

2 ответа

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

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

  • Установить WSE 3.0 , выберите Custom и выберите Все
  • Прочитайте Реализация прямой аутентификации с токеном имени пользователя в WSE 3.0 для подсказки
  • Relauch Visual Studio 2005, теперь щелкните правой кнопкой мыши на вашем проекте в исследовательском исследовании, и вы должны иметь WSE Настройки 3.0 Пункт меню и используйте, что если вы хотите.
  • Обновите свои веб-ссылки, это должно создать новый класс прокси-сервиса HTTP, с другим именем, например, yourwsnamehttpservicewse . Это, по сути так же, как работает wsewdl3.exe
  • . Используйте этот новый класс, и вы должны иметь доступ к методам и свойствам WSE, такие как SetClientCredental .

Я закончил делать практически все в коде, вместо того, чтобы полагаться на файлы конфигурации, которые построены с моим 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 Server ответил, что требуемый заголовок, представляющий свойство адресации сообщения, отсутствует , и осматривая исходящее сообщение (используя приятный инструмент Fiddler ) Я видел, как ясил неисправность SOAP с сервера указывает, что заголовок действия отсутствовал.

Я пытался напрасно, чтобы установить WSA: действие WSA сам:

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(...)

после этого все это разработано хорошо.

11
ответ дан 5 December 2019 в 06:37
поделиться

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

Вы можете сделать это либо путем изменения самого класса прокси, либо путем создания его через командную строку с использованием WSEWSDL3.exe с помощью коммутатора / типа: 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, идущий в студии 2008 года. Надежда, которая поможет.

14
ответ дан 5 December 2019 в 06:37
поделиться
Другие вопросы по тегам:

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