سؤال

هذه هي وثيقة XML الخاصة بي.أريد التوقيع على جزء معرف المستخدم فقط باستخدام توقيع XML.أنا أستخدم تحويل xpath لتحديد هذا العنصر المعين.

<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


ما المشكلة؟
يحرر
كما قالJörn Horstmann، الرسالة هي مجرد سجل أو شيء من هذا القبيل.المشكلة الآن هي أنه حتى بعد إعطاء استعلام xpath، يتم توقيع المستند بأكمله بدلاً من معرف المستخدم فقط.لقد أكدت ذلك عن طريق تغيير قيمة <testing>العنصر بعد التوقيع على الوثيقة.والنتيجة هي عدم التحقق من صحة المستند (إذا تم التوقيع على جزء معرف المستخدم فقط، فسيتم إجراء أي تغييرات على <testing> يجب أن يؤدي إلى توقيع صالح.)

هل كانت مفيدة؟

المحلول

هذا ليس تعبير 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"))

يحرر:

لا يبدو أن الرسالة خطأ، انظر السطر 426 هنا, ، فمن المحتمل أن يكون مستوى السجل الخاص به أقل من INFO بالرغم من ذلك.

لقد ألقيت نظرة أيضًا على وصف تصفية xpath:

يتم تقييم تعبير XPath الذي يظهر في معلمة XPath مرة واحدة لكل عقدة في مجموعة عقدة الإدخال.يتم تحويل النتيجة إلى منطقية.إذا كان المنطقي صحيحًا، فسيتم تضمين العقدة في مجموعة عقدة الإخراج.إذا كانت القيمة المنطقية خاطئة، فسيتم حذف العقدة من مجموعة عقدة الإخراج.

لذا فإن تعبير xpath الصحيح يتضمن فقط ملف UserID في التوقيع سيكون self::UserID.لكن لا تسألني إذا كان هذا منطقيًا بالفعل بالنسبة لتوقيع XML.يبدو أن المثال الموجود في المواصفات يستخدم تعبير xpath ليشمل كل شيء باستثناء عنصر التوقيع نفسه:

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

تحرير 2:

التعبير الصحيح هو في الواقع ancestor-or-self::UserID نظرًا لأن المرشح يجب أيضًا أن يتضمن العقد الفرعية النصية لـ UserID العقدة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top