Question

C'est mon document xml.Je veux m'inscrire seulement le nom de la partie à l'aide de xml signature.Je suis à l'aide de xpath transformation pour sélectionner cet élément particulier.

<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>


J'utilise le code suivant pour ajouter les transformations :

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


Mais je reçois le texte suivant :

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


Donc, j'ai essayé de supprimer les xmlns partie.

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


Mais il signe le document en entier et vous donne le message suivant :

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


Quel est le problème?
MODIFIER
Comme @Jörn Horstmann dit que le message est juste un journal ou quelque chose comme ça.Maintenant, le problème, c'est que même après avoir donné à la requête de xpath l'ensemble du document est signé au lieu de simplement le nom d'utilisateur.J'ai confirmé ce, en modifiant la valeur de <testing>élément après la signature du document.Le résultat est que le document ne doit pas être validé(Si il n'avait signé que le nom d'utilisateur, puis toutes les modifications apportées à <testing> devrait aboutir à une signature valide .)

Était-ce utile?

La solution

Ce n'est pas une expression xpath valide, il n'existe aucun moyen de déclarer l'espace de noms de prefixe l'intérieur de l'expression.

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

XPathFilterParameterSpec il possède une autre constructeur qui permet de spécifier une cartographie des préfixes d'espace de noms, vous pouvez essayer de l'expression suivante:

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

Edit:

Le message ne semble pas être une erreur, voir ligne 426 ici, son niveau de journal devrait probablement être inférieur INFO cependant.

J'ai également eu un coup d'oeil à la description de xpath filtrage:

L'expression XPath figurant dans le XPath paramètre est évalué une fois pour chaque nœud le nœud d'entrée-set.Le résultat est converti en une valeur de type boolean.Si le booléen est vrai, alors le nœud est inclus dans la sortie node-set.Si le booléen est faux, alors le nœud est omis de la sortie node-set.

Donc la bonne expression xpath pour inclure uniquement les UserID dans la signature self::UserID.Mais ne me demandez pas si cela a un sens pour un xml signature.L'exemple dans le cahier des charges semble utiliser une expression xpath pour tout englober, à l'exception de la signature de l'élément lui-même:

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

Edit 2:

L'expression correcte est en fait ancestor-or-self::UserID depuis le filtre doit également inclure le texte des nœuds enfants de l' UserID nœud.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top