I have created a simple EJB3 project and exposed it as a web service (your
typical Echo service). I'm using WSSE UsernameToken headers in the SOAP
requests to send authentication info. I can successfully authenticate using a
username and digesting the password (e.g. Base64 encode of the SHA-1 hash).
However, when I encorporate the Created node and add to the digest I get an
"Invalid User" exception. But, I can use just the hash of the password (without
the created node) and authenticate successfully. According to the docs from
the OASIS site the digest is computed as (taken from Web Services Security
UsernameToken Profile):
| Password_Digest = Base64 ( SHA-1 ( nonce + created + password ) )
|
I'm currently not using a Nonce since the spec says that both the Nonce and the
Created are optional.
It's as if the server is ignoring the fact that the created node exists. I'm
not fully confident that I have the jboss-wsse-server.xml file set up or even
the security header. See below for the appropriate files. Any thoughts would
be appreciated.
EJB3 Service:
| package com.test;
|
| import javax.annotation.security.RolesAllowed;
| import javax.ejb.Stateless;
| import javax.jws.WebMethod;
| import javax.jws.WebParam;
| import javax.jws.WebResult;
| import javax.jws.WebService;
|
| import org.jboss.ws.annotation.EndpointConfig;
|
| @Stateless
| @WebService(endpointInterface = "com.test.IEchoSession",
serviceName="EchoService", portName="EchoServiceSOAP")
| @EndpointConfig(configName = "Standard WSSecurity Endpoint")
| public class EchoSession implements IEchoSession {
|
| /**
| *
| */
| private static final long serialVersionUID = 1L;
|
| @Override
| @WebMethod(operationName="Echo")
| @WebResult(partName="EchoResponse")
| @RolesAllowed(value={"friend"})
| public String echo(@WebParam(partName="text") String text) {
| return "You said: " + text;
| }
|
| }
|
jboss.xml (in the EJB3 META-INF folder):
<?xml version="1.0" encoding="utf-8"?>
| <jboss>
| <security-domain>java:/jaas/MyRealm</security-domain>
| <webservices>
| <context-root>/echo</context-root>
| </webservices>
| <enterprise-beans>
| <session>
| <ejb-name>EchoSession</ejb-name>
| <port-component>
|
<port-component-name>EchoSession</port-component-name>
|
<port-component-uri>/EchoService</port-component-uri>
| <transport-guarantee>NONE</transport-guarantee>
| <secure-wsdl-access>false</secure-wsdl-access>
| </port-component>
| </session>
| </enterprise-beans>
|
| </jboss>
jboss-wsse-server.xml (also in the META-INF):
<jboss-ws-security xmlns="http://www.jboss.com/ws-security/config"
| xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xsi:schemaLocation="http://www.jboss.com/ws-security/config
|
http://www.jboss.com/ws-security/schema/jboss-ws-security_1_0.xsd">
| <config>
| <username/>
| <timestamp ttl="300"/>
| <timestamp-verification createdTolerance="100"
warnCreated="false" expiresTolerance="100" warnExpires="false" />
| <authenticate>
| <usernameAuth/>
| </authenticate>
| </config>
| </jboss-ws-security>
|
On the client side (flex component) the following header get's added to the
request:
| private function addWSSEHeader(): SOAPHeader {
|
| var date : Date = new Date();
| _ds = getDateString(date);
| date.minutes += 3;
|
| var plain : String = SHA1.hashToBase64(password.text);
|
| _password = SHA1.hashToBase64(_ds + password.text);
|
| trace("plain: " + plain);
| trace("timestamp " + _password);
| var usernameTokenXML:XML =
| <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">
| <wsu:Timestamp
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
| <wsu:Created>{_ds}</wsu:Created>
| <wsu:Expires>{getDateString(date)}</wsu:Expires>
| </wsu:Timestamp>
| <wsse:UsernameToken>
| <wsse:Username
Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">{username.text}</wsse:Username>
| <wsse:Password
Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest"
|
xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">{_password}</wsse:Password>
| <wsu:Created>{_ds}</wsu:Created>
| </wsse:UsernameToken>
| </wsse:Security>
|
| var wsse: Namespace = new
Namespace("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");
| var wsseSecurity: QName = new QName(wsse.uri, "Security");
| var header: SOAPHeader = new SOAPHeader(wsseSecurity,
{"wsse":"Security"});
| header.content = usernameTokenXML;
|
| return header;
| }
|
|
And here is an example of the SOAP message:
| <SOAP-ENV:Envelope
xmlns:SOAP-ENV='http://schemas.xmlsoap.org/soap/envelope/'
xmlns:xs='http://www.w3.org/2001/XMLSchema'
xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'><SOAP-ENV: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'>
| <wsu:Timestamp>
| <wsu:Created>2009-09-25T13:07:29Z</wsu:Created>
| <wsu:Expires>2009-09-25T13:10:29Z</wsu:Expires>
| </wsu:Timestamp>
| <wsse:UsernameToken>
| <wsse:Username
Type='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd'>kermit</wsse:Username>
| <wsse:Password
Type='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest'>lKnNIypKvfb27kzvQynQtS+iNUc=</wsse:Password>
| <wsu:Created>2009-09-25T13:07:29Z</wsu:Created>
| </wsse:UsernameToken>
| </wsse:Security></SOAP-ENV:Header><SOAP-ENV:Body>
| <tns:echo xmlns:tns='http://test.com/'>
| <arg0>test</arg0>
| </tns:echo>
| </SOAP-ENV:Body></SOAP-ENV:Envelope>
|
View the original post :
http://www.jboss.org/index.html?module=bb&op=viewtopic&p=4257096#4257096
Reply to the post :
http://www.jboss.org/index.html?module=bb&op=posting&mode=reply&p=4257096
_______________________________________________
jboss-user mailing list
[email protected]
https://lists.jboss.org/mailman/listinfo/jboss-user