2012-05-22 41 views
-1

這是我的xml文檔。我只想使用xml簽名來簽署userID部分。我正在使用xpath轉換來選擇特定元素。Xpath轉換在java中不起作用

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


我使用下面的代碼添加變換:

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


但我得到以下幾點:

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


於是,我試着刪除xmlns部分。

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


但它簽署的整份文件,並提供了以下消息:

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


問題是什麼?
編輯
As @JörnHorstmann說這個消息只是一個日誌或類似的東西。現在的問題是,即使在給出xpath查詢之後,整個文檔被簽名而不僅僅是用戶ID。我通過在簽署文檔後更改<testing>元素的值來證實了這一點。結果是文檔沒有得到驗證(如果它只簽署了UserID部分,則對<testing>所做的任何更改都應產生有效簽名。)

回答

3

這不是有效的xpath表達式,沒有辦法在表達式中聲明名稱空間前綴。

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

XPathFilterParameterSpec確實有另一個構造函數允許指定命名空間前綴的映射,你可以嘗試下面的表達式:

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

編輯:

的消息似乎並沒有是一個錯誤,請參閱line 426 here,但其日誌級別應該可能低於INFO。

我也有一看description of xpath filtering

出現在XPath參數的XPath表達式在輸入節點集合的每個節點計算一次。結果被轉換爲布爾值。如果布爾值爲true,則該節點包含在輸出節點集中。如果布爾值爲假,則從輸出節點集中省略該節點。

所以正確的xpath表達式只包含UserID在簽名中就是self::UserID。但不要問我這是否對xml簽名有意義。在本說明書的例子中,似乎使用XPath表達式包括除了所述簽名元件本身的一切:

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

編輯2:

正確表達實際上是ancestor-or-self::UserID由於過濾器還必須包括UserID節點的文本子節點。

+0

感謝您的回覆。我嘗試過這個。非法令牌錯誤消失了。但是現在在簽署文檔後,我更改了userID值,然後嘗試驗證此更改的文檔。它得到完美驗證(它不應該發生)。我仍然開始消息:com.sun.org.apache.xml.internal.security.utils.CachedXPa thFuncHereAPI fixupFunctionTable 信息:在這裏註冊函數 – Ashwin

+0

我試過「samlp:AuthnRequest/self :: UserID」和「samlp :AuthnRequest //自::用戶名」。它仍然簽署整個文件。 – Ashwin

+0

請參閱編輯。 – Ashwin