Axis2/Java client throws exception with mustUnderstand=1
--------------------------------------------------------
Key: RAMPART-281
URL: https://issues.apache.org/jira/browse/RAMPART-281
Project: Rampart
Issue Type: Bug
Affects Versions: 1.4
Environment: Server: Linux, Axis2/C
Client: Windows, Axis2/Java
Reporter: Russell Tempero
Assignee: Ruchith Udayanga Fernando
We have implemented our service with the following security policy:
<wsp:Policy wsu:Id="SyncPolicy"
xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy"
xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy"
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<wsp:ExactlyOne>
<wsp:All>
<sp:TransportBinding>
<wsp:Policy>
<sp:TransportToken>
<wsp:Policy>
<sp:HttpsToken/>
</wsp:Policy>
</sp:TransportToken>
<sp:AlgorithmSuite>
<wsp:Policy>
<sp:Basic256/>
</wsp:Policy>
</sp:AlgorithmSuite>
<sp:Layout>
<wsp:Policy>
<sp:Lax/>
</wsp:Policy>
</sp:Layout>
</wsp:Policy>
</sp:TransportBinding>
<sp:SignedSupportingTokens>
<wsp:Policy>
<sp:UsernameToken
sp:IncludeToken="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy/IncludeToken/AlwaysToRecipient">
<wsp:Policy>
<sp:WssUsernameToken10/>
</wsp:Policy>
</sp:UsernameToken>
</wsp:Policy>
</sp:SignedSupportingTokens>
</wsp:All>
</wsp:ExactlyOne>
</wsp:Policy>
On the client, we are able to use Rampart to send out the correct security
headers as expected by the server:
<soapenv:Header>
<wsse:Security
xmlns:wsse='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd'
soapenv:mustUnderstand='1'>
<wsse:UsernameToken
xmlns:wsu='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd'
wsu:Id='UsernameToken-12864392'>
<wsse:Username>admin</wsse:Username>
<wsse:Password
Type='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText'>admin</wsse:Password>
</wsse:UsernameToken>
</wsse:Security>
</soapenv:Header>
However, in the response, the server send back a blank security header:
<soapenv:Header>
<wsse:Security
xmlns:wsse='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd'
soapenv:mustUnderstand='1'></wsse:Security>
</soapenv:Header>
When the client receives this blank security header, it throws the following
exception:
Must Understand check failed for header
http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd
: Security
Is the blank security header required/allowed in the response according to the
WS-Security specification? If so, the Rampart implementation on the client
needs to be changed to be able to accept this header. If the blank header is
not allowed, the server needs to be changed to not send it.
Note: we came up with the following workaround on the client:
.
.
.
ConfigurationContext configurationContext =
ConfigurationContextFactory.createConfigurationContextFromFileSystem("C:\\Program
Files\\axis2-1.5.1\\repository", null);
AxisConfiguration ac =
configurationContext.getAxisConfiguration();
((Phase)ac.getInFlowPhases().get(0)).addHandler(new
BasicCreate.SecurityHandler());
.
.
.
public static class SecurityHandler extends AbstractHandler
{
@Override
public InvocationResponse invoke(MessageContext msgContext) throws
AxisFault
{
org.apache.axiom.soap.SOAPEnvelope envelope =
msgContext.getEnvelope();
if (envelope.getHeader() == null)
{
return InvocationResponse.CONTINUE;
}
// Get all the headers targeted to us
Iterator headerBlocks =
envelope.getHeader().getHeadersToProcess((RolePlayer)msgContext.getConfigurationContext().getAxisConfiguration().getParameterValue("rolePlayer"));
while (headerBlocks.hasNext())
{
SOAPHeaderBlock headerBlock = (SOAPHeaderBlock)
headerBlocks.next();
QName headerName = headerBlock.getQName();
if(headerName.getLocalPart().equals("Security"))
{
headerBlock.setProcessed();
}
}
return InvocationResponse.CONTINUE;
}
}
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.