Добавление SOAP: имя пользователя и пароль HEADER с помощью WSE 3.0
Я успешно создал 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
, но до сих пор мне не удалось что-то запустить и запустить.
Любые подсказки будут очень признательны, поскольку я не могу найти полезные рецепты в сети.
Спасибо!
Ответы
Ответ 1
Сработал, к сожалению, перед тем, как читать отличный ответ vsanville.
Чтобы помочь другим, я публикую все шаги, которые мне нужно сделать, чтобы заставить его работать с Visual Studio 2005:
- Установите WSE 3.0, выберите пользовательский и выберите все
- Прочитайте Внедрение прямой аутентификации с помощью токена имени пользователя в WSE 3.0 для подсказок
- Перезапустите Visual Studio 2005, теперь щелкните правой кнопкой мыши на своем проекте в проводнике решений, и у вас должен быть пункт меню WSE Settings 3.0 и использовать его, если хотите.
- Обновляйте свои веб-ссылки, это должно создать новый прокси-сервер веб-службы HTTP с другим именем, например.
YourWsNameHttpServiceWse
. Это по сути то же самое, что работает wsewsdl3.exe
- Используйте этот новый класс, и у вас должен быть доступ к методам и свойствам WSE, таким как
SetClientCredential
.
В итоге я сделал почти все в коде, вместо того, чтобы полагаться на конфигурационные файлы, которые были созданы с моей С# 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 с сервера указала, что заголовок действия отсутствует.
Я тщетно пытался установить элемент 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(...)
После этого все получилось красиво.
Ответ 2
Убедитесь, что ваш класс прокси наследуется от 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. Надеюсь, что это поможет.