Учетные данные безопасности C # для сообщения SOAP ОШИБКА - WS-Security (WSS) - PullRequest
0 голосов
/ 26 июня 2019

Я пытаюсь вызвать метод на клиенте WebReference (веб-службы), который должен использовать WS-Security. Когда я выполняю метод cargaFicheiro, он возвращает следующую ошибку:

Предоставлен неверный токен безопасности (произошла ошибка при обработке токен имени пользователя).

Код, который я использую:

// Cuidamos is a WebReference do a WSDL url in https

var token = new UsernameToken("Username", "Password", PasswordOption.SendPlainText);

var serviceProxy = new Cuidamos.CargaFicheiroServiceImplService();

SoapContext requestContext = serviceProxy.RequestSoapContext;
requestContext.Security.Timestamp.TtlInSeconds = 300;
requestContext.Security.Tokens.Add(token);

var result = serviceProxy.cargaFicheiro();

Заголовок SOAP должен соответствовать этому:

<soap:Header>
    <wsse:Security 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" soap:mustUnderstand="1">
        <wsu:Timestamp wsu:Id="TS-2">
            <wsu:Created>2013-10-07T10:13:52Z</wsu:Created>
            <wsu:Expires>2013-10-07T10:20:32Z</wsu:Expires>
        </wsu:Timestamp>
        <wsse:UsernameToken wsu:Id="UsernameToken-1">
            <wsse:Username>USERNAME</wsse:Username>
            <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">PASSWORD</wsse:Password>
        </wsse:UsernameToken>
    </wsse:Security>
</soap:Header>

Я использовал следующий ответ для реализации своего кода: https://stackoverflow.com/a/40030906/2449703

Основываясь на Microsoft, я делаю все правильно: https://docs.microsoft.com/en-us/previous-versions/dotnet/netframework-1.1/ms819938(v=msdn.10)

Опять другой ответ, который работает, но не в моем случае: https://forums.asp.net/t/2133187.aspx?C+oasis+Username+token

Спасибо.

Ответы [ 2 ]

1 голос
/ 27 июня 2019

WSSE Nonce - это атрибут безопасности с уникальным идентификатором, разработанный для предотвращения атак воспроизведения. Ваш сервер, вероятно, генерирует это, потому что у вас есть настраиваемая привязка службы, настроенная в конфигурации службы.

Он должен работать ровно один раз, поэтому, вероятно, вы не сможете использовать его повторно из SOAPUI

Больше информации здесь:

https://weblog.west -wind.com / posts / 2012 / nov / 24 / wcf-wssecurity-and-wse-nonce-authentication

0 голосов
/ 27 июня 2019

Мой вопрос почти решен.

Я заметил, что заголовок SOAP, сгенерированный этим кодом, выглядит следующим образом:

<soapenv:Header>
    <wsa:Action></wsa:Action>
    <wsa:MessageID>uuid:2eead708-03f9-4624-a866-35f3730eac23</wsa:MessageID>
    <wsa:ReplyTo>
        <wsa:Address>http://schemas.xmlsoap.org/ws/2004/03/addressing/role/anonymous</wsa:Address>
    </wsa:ReplyTo>
    <wsa:To>https://cuidamos.com/ws/cuidamos</wsa:To>
    <wsse:Security soapenv:mustUnderstand="1">
        <wsu:Timestamp wsu:Id="Timestamp-64f67137-f82d-4a9c-8b2e-1cc41104683d">
            <wsu:Created>2019-06-27T12:48:00Z</wsu:Created>
            <wsu:Expires>2019-06-27T12:53:00Z</wsu:Expires>
        </wsu:Timestamp>
        <wsse:UsernameToken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="SecurityToken-b8467c25-c62c-406a-9831-46e6c676153a">
            <wsse:Username>Username</wsse:Username>
            <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">Password</wsse:Password>
            <wsse:Nonce>JEmovy7RDpapzumPTiUUgQ==</wsse:Nonce>
            <wsu:Created>2019-06-27T12:48:00Z</wsu:Created>
        </wsse:UsernameToken>
    </wsse:Security>
</soapenv:Header>

И я использовал это решение для отслеживания моего сообщения о запросе мыла.

Но когда я использую приложение SoapUI, чтобы сделать запрос с этим заголовком SOAP, я заметил, что если я удалю элемент , он будет работать нормально. Поэтому мне нужно удалить этот элемент , который генерируется динамически, и именно здесь я работаю, но пока не знаю, как это сделать.

EDIT

Я почти на месте, я обнаружил, что если я создаю атрибут EncodingType внутри элемента Nonce, он работает, мне не нужно удалять элемент Nonce. Это было проверено на SoapUI.

Элемент Nonce должен быть создан следующим образом, innerText для элемента Nonce - это хеш-строка (SHA-1), создаваемая при каждом запросе:

6OX8gvIRETEbzaCwZ4byn / NEpzDI = </ wsse: Нонс>

Для достижения этого результата я создал динамически UsernameToken с XML:

XmlDocument document = new XmlDocument();
XmlElement usernameTokenElement = document.CreateElement("wsse", "UsernameToken", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");

XmlElement usernameChild;
usernameChild = document.CreateElement("wsse", "Username", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");
usernameChild.InnerText = "WSMASSIT";
usernameTokenElement.AppendChild(usernameChild);

XmlElement passwordChild;
passwordChild = document.CreateElement("wsse", "Password", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");
passwordChild.SetAttribute("Type", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText");
passwordChild.InnerText = "AstWs218";
usernameTokenElement.AppendChild(passwordChild);

string phrase = Guid.NewGuid().ToString();
var nonce = GetSHA1String(phrase); // User Function to create SHA-1 Hash String

XmlElement nonceChild;
nonceChild = document.CreateElement("wsse", "Nonce", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");
nonceChild.SetAttribute("EncodingType", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary");
nonceChild.InnerText = nonce;
usernameTokenElement.AppendChild(nonceChild);

var token = new UsernameToken(usernameTokenElement);

Теперь у меня есть другая проблема: дочерние элементы имени пользователя и пароля создаются с успехом, но дочерние элементы Nonce перезаписываются во время выполнения, что означает, что имя пользователя и пароль создаются точно так же, как я кодировал, но Nonce продолжает создаваться без EncondingType и innerText строка хеша отличается от того, что создал мой код.

РЕДАКТИРОВАТЬ 2

Я сделал простой тест, добавив следующий код

document.AppendChild(usernameTokenElement);

var xml = token.GetXml(document);

И если я проверяю документ, я вижу элемент Nonce с атрибутом EncodingType, но если я проверяю xml, у него нет атрибута EncodingType для элемента Nonce.

РЕДАКТИРОВАТЬ 3

Проблема решена, но на вопрос EDIT 2 нет ответа. В двух словах, Nonce больше не требуется, отдел, отвечающий за управление этой конечной точкой, выполнил эту настройку на сервере. В спецификации UsernameToken WSS document написано, что Nonce и Created не требуются, поэтому этим предположением проблема была решена таким образом, помня, что этот запрос сделан по протоколу https (туннелирование SSL).

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