Pergunta

Este é o meu documento xml.Quero assinar apenas a parte do userID usando assinatura xml.Estou usando a transformação XPath para selecionar esse elemento específico.

<samlp:AuthnRequest xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"
Version="2.0" IssueInstant="2012-05-22T13:40:52:390" ProtocolBinding="urn:oasis:na
mes:tc:SAML:2.0:bindings:HTTP-POST" AssertionConsumerServiceURL="localhos
t:8080/consumer.jsp">
<UserID>
   xyz
</UserID>
<testing>
   text
</testing>
<saml:Issuer xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">
   http://localhost:8080/saml/SProvider.jsp
</saml:Issuer>
</samlp:AuthnRequest>


Estou usando o seguinte código para adicionar as transformações:

transformList.add(exc14nTransform);
 transformList.add(fac.newTransform(Transform.XPATH, new XPathFilterParameterSpec("samlp:AuthnRequest/UserID xmlns:samlp=\"urn:oasis:names:tc:SAML:2.0:protocol\"")));


Mas eu recebo o seguinte:

Original Exception was javax.xml.transform.TransformerException: Extra illegal t
okens: 'xmlns', ':', 'samlp', '=', '"urn:oasis:names:tc:SAML:2.0:protocol"'


Então, tentei remover a parte xmlns.

transformList.add(fac.newTransform(Transform.XPATH, new XPathFilterParameterSpec("samlp:AuthnRequest/UserID")));


Mas assina todo o documento e dá a seguinte mensagem:

com.sun.org.apache.xml.internal.security.utils.CachedXPa
thFuncHereAPI fixupFunctionTable
INFO: Registering Here function


Qual é o problema?
EDITAR
Como disse @Jörn Horstmann, a mensagem é apenas um log ou algo parecido.Agora o problema é que mesmo depois de fornecer a consulta XPath, todo o documento é assinado em vez de apenas o UserID.Eu confirmei isso alterando o valor de <testing>elemento após assinar o documento.O resultado é que o documento não é validado (se ele assinou apenas a parte do UserID, então quaisquer alterações feitas no <testing> deve resultar em uma assinatura válida.)

Foi útil?

Solução

Esta não é uma expressão XPath válida, não há como declarar o prefixo do namespace dentro da expressão.

samlp:AuthnRequest/UserID xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"

XPathFilterParameterSpec possui outro construtor que permite especificar um mapeamento de prefixos de namespace, você pode tentar a seguinte expressão:

new XPathFilterParameterSpec("samlp:AuthnRequest/UserID",
    Collections.singletonMap("samlp", "urn:oasis:names:tc:SAML:2.0:protocol"))

Editar:

A mensagem não parece ser um erro, consulte linha 426 aqui, seu nível de log provavelmente deverá ser menor que INFO.

Eu também dei uma olhada no descrição da filtragem XPath:

A expressão XPath que aparece no parâmetro XPath é avaliada uma vez para cada nó no conjunto de nós de entrada.O resultado é convertido em booleano.Se o booleano for verdadeiro, o nó será incluído no conjunto de nós de saída.Se o booleano for falso, o nó será omitido do conjunto de nós de saída.

Portanto, a expressão XPath correta para incluir apenas o UserID na assinatura seria self::UserID.Mas não me pergunte se isso realmente faz sentido para uma assinatura XML.O exemplo na especificação parece usar uma expressão XPath para incluir tudo, exceto o próprio elemento de assinatura:

not(ancestor-or-self::dsig:Signature)

Editar 2:

A expressão correta é na verdade ancestor-or-self::UserID já que o filtro também deve incluir os nós filhos de texto do UserID nó.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top