Пример запроса SOAP, прошедшего проверку подлинности с помощью WS-UsernameToken
Я пытаюсь аутентифицировать запрос SOAP с помощью спецификации WS-UsernameToken, но целевое устройство всегда запрещает доступ. Моя нерабочая просьба выглядит так. (Пароль я пытаюсь хэш system
.)
<?xml version="1.0" encoding="UTF-8"?>
<Envelope xmlns="http://www.w3.org/2003/05/soap-envelope">
<Header>
<Security xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<UsernameToken>
<Username>root</Username>
<Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">EVpXS/7yc/vDo+ZyIg+cc0fWdMA=</Password>
<Nonce>tKUH8ab3Rokm4t6IAlgcdg9yaEw=</Nonce>
<Created xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">2010-08-10T10:52:42Z</Created>
</UsernameToken>
</Security>
</Header>
<Body>
<SomeRequest xmlns="http://example.ns.com/foo/bar" />
</Body>
</Envelope>
то, что я ищу, - это аналогичный пример запроса, но с токеном аутентификации, который действительно работает. Например, если у вас есть приложение gSOAP, которое использует этот токен, и может генерировать запрос и публиковать результат здесь, я был бы очень благодарен.
4 ответов
суть в том, чтобы определить префиксы для пространств имен и использовать их для укрепления каждого тега - вы смешиваете 3 пространства имен, и это просто не летает, пытаясь взломать значения по умолчанию. Также хорошо использовать именно префиксы, используемые в стандартный doc-на случай, если другая сторона станет немного небрежной.
последнее, но не менее важное, гораздо лучше использовать типы по умолчанию для полей, когда вы можете-поэтому для пароля вы должны перечислить тип, для Nonce это уже в base64.
убедитесь, что вы проверяете правильность сгенерированного токена, прежде чем отправлять его через XML, и не забывайте, что содержимое Wsse:Password-Base64( SHA-1 (nonce + created + password) ) и дата-время в wsu:Created может легко испортить вас. Поэтому, как только вы исправите префиксы и пространства имен и убедитесь, что yout SHA-1 отлично работает без XML (просто представьте, что вы проверяете запрос и выполняете серверную часть вычисления SHA-1) , вы также можете сделать truial Wihtout даже без нонсе. Oh и Nonce могут иметь разные кодировки, поэтому, если вы действительно хотите заставить другую кодировку, вам придется заглянуть дальше в пространство имен wsu.
<S11:Envelope xmlns:S11="..." xmlns:wsse="..." xmlns:wsu= "...">
<S11:Header>
...
<wsse:Security>
<wsse:UsernameToken>
<wsse:Username>NNK</wsse:Username>
<wsse:Password Type="...#PasswordDigest">weYI3nXd8LjMNVksCKFV8t3rgHh3Rw==</wsse:Password>
<wsse:Nonce>WScqanjCEAC4mQoBE07sAQ==</wsse:Nonce>
<wsu:Created>2003-07-16T01:24:32</wsu:Created>
</wsse:UsernameToken>
</wsse:Security>
...
</S11:Header>
...
</S11:Envelope>
на поддержка хэш-пароля и параметры утверждения токенов в Metro 1.2 очень хорошо объясняет, как выглядит UsernameToken с паролем Digest:
Поддержка Digest Password
на WSS 1.1 маркер имени пользователя Профиль позволяет переварить пароли быть посланным в
wsse:UsernameToken
of a сообщение SOAP. Более двух факультативных элементы включены вwsse:UsernameToken
в этом случае:wsse:Nonce
иwsse:Created
. Ля nonce-случайное значение, которое отправитель создает в каждой UsernameToken, который он отправляет. Ля время создания добавляется для объединения nonces к периоду времени "свежести". Дайджест паролей в этом случае вычисляется как:Password_Digest = Base64 ( SHA-1 ( nonce + created + password ) )
это как UsernameToken с Дайджест пароля выглядит так:
<wsse:UsernameToken wsu:Id="uuid_faf0159a-6b13-4139-a6da-cb7b4100c10c"> <wsse:Username>Alice</wsse:Username> <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">6S3P2EWNP3lQf+9VC3emNoT57oQ=</wsse:Password> <wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">YF6j8V/CAqi+1nRsGLRbuZhi</wsse:Nonce> <wsu:Created>2008-04-28T10:02:11Z</wsu:Created> </wsse:UsernameToken>
проверьте это (пароль должен быть паролем):
<wsse:UsernameToken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="SecurityToken-6138db82-5a4c-4bf7-915f-af7a10d9ae96">
<wsse:Username>user</wsse:Username>
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">CBb7a2itQDgxVkqYnFtggUxtuqk=</wsse:Password>
<wsse:Nonce>5ABcqPZWb6ImI2E6tob8MQ==</wsse:Nonce>
<wsu:Created>2010-06-08T07:26:50Z</wsu:Created>
</wsse:UsernameToken>
может быть этот пост (безопасный веб-сервис Metro JAX-WS UsernameToken с подписью, шифрованием и TLS (SSL)) обеспечивает более глубокое понимание. Как они упоминали "помните, если текст пароля или переваренный пароль не отправлен по защищенному каналу или маркер не зашифрован, ни дайджест пароля, ни пароль с открытым текстом не обеспечивают реальной дополнительной безопасности. "