{"id":11622,"date":"2025-08-19T21:20:48","date_gmt":"2025-08-20T02:20:48","guid":{"rendered":"https:\/\/www.rushworth.us\/lisa\/?p=11622"},"modified":"2025-08-19T21:20:48","modified_gmt":"2025-08-20T02:20:48","slug":"pingfederate-ognl-customization-of-authncontext","status":"publish","type":"post","link":"https:\/\/www.rushworth.us\/lisa\/?p=11622","title":{"rendered":"PingFederate \u2013 OGNL Customization of AuthnContext"},"content":{"rendered":"<p>After a recent merger, we have added federated authentication in our PingFederate environment that allows the incoming company to continue to use their Entra (ADFS) logon process to authenticate through PingFederate. All of the IDs exist in our directory, and contract attributes are populated based on the local account. But the <em>authentication<\/em> is handled by their existing system. It\u2019s really cool, and works for 99.9% of the applications. One, however, was not happy with the resultant attribute contract. It worked fine for me, logging in directly with PingFederate. Anyone who authenticated through Entra, however, got a very specific error:<\/p>\n<p><strong>AuthenticatingAuthority array contains a value which is not a wellformed absolute uri<\/strong><\/p>\n<p>And, yes, I concur \u2013 there is absolutely an element in the AuthenticatingAuthority array that is not a well-formed absolute URI<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" width=\"945\" height=\"80\" class=\"wp-image-11623\" src=\"https:\/\/www.rushworth.us\/lisa\/wp-content\/uploads\/2025\/08\/word-image-11622-1.png\" srcset=\"https:\/\/www.rushworth.us\/lisa\/wp-content\/uploads\/2025\/08\/word-image-11622-1.png 945w, https:\/\/www.rushworth.us\/lisa\/wp-content\/uploads\/2025\/08\/word-image-11622-1-300x25.png 300w, https:\/\/www.rushworth.us\/lisa\/wp-content\/uploads\/2025\/08\/word-image-11622-1-768x65.png 768w, https:\/\/www.rushworth.us\/lisa\/wp-content\/uploads\/2025\/08\/word-image-11622-1-750x63.png 750w\" sizes=\"auto, (max-width: 945px) 100vw, 945px\" \/><\/p>\n<p>Luckily, there appears to be a solution. On the ACS URL tab, select \u201cShow Advanced Customizations\u201d<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" width=\"827\" height=\"439\" class=\"wp-image-11624\" src=\"https:\/\/www.rushworth.us\/lisa\/wp-content\/uploads\/2025\/08\/a-screenshot-of-a-computer-ai-generated-content-m.png\" alt=\"A screenshot of a computer\n\nAI-generated content may be incorrect.\" srcset=\"https:\/\/www.rushworth.us\/lisa\/wp-content\/uploads\/2025\/08\/a-screenshot-of-a-computer-ai-generated-content-m.png 827w, https:\/\/www.rushworth.us\/lisa\/wp-content\/uploads\/2025\/08\/a-screenshot-of-a-computer-ai-generated-content-m-300x159.png 300w, https:\/\/www.rushworth.us\/lisa\/wp-content\/uploads\/2025\/08\/a-screenshot-of-a-computer-ai-generated-content-m-768x408.png 768w, https:\/\/www.rushworth.us\/lisa\/wp-content\/uploads\/2025\/08\/a-screenshot-of-a-computer-ai-generated-content-m-750x398.png 750w\" sizes=\"auto, (max-width: 827px) 100vw, 827px\" \/><\/p>\n<p>Use the drop-down to select the message type of \u201cAssertionType\u201d and the expression provided at <a href=\"https:\/\/support.pingidentity.com\/s\/article\/OGNL-Examples-Message-Customization#rm-authauthority\">https:\/\/support.pingidentity.com\/s\/article\/OGNL-Examples-Message-Customization#rm-authauthority<\/a> to remove authenticating authority values when multiple are present (which also works when only one is present)<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" width=\"1632\" height=\"208\" class=\"wp-image-11625\" src=\"https:\/\/www.rushworth.us\/lisa\/wp-content\/uploads\/2025\/08\/a-close-up-of-a-computer-screen-ai-generated-cont.png\" alt=\"A close-up of a computer screen\n\nAI-generated content may be incorrect.\" srcset=\"https:\/\/www.rushworth.us\/lisa\/wp-content\/uploads\/2025\/08\/a-close-up-of-a-computer-screen-ai-generated-cont.png 1632w, https:\/\/www.rushworth.us\/lisa\/wp-content\/uploads\/2025\/08\/a-close-up-of-a-computer-screen-ai-generated-cont-300x38.png 300w, https:\/\/www.rushworth.us\/lisa\/wp-content\/uploads\/2025\/08\/a-close-up-of-a-computer-screen-ai-generated-cont-1024x131.png 1024w, https:\/\/www.rushworth.us\/lisa\/wp-content\/uploads\/2025\/08\/a-close-up-of-a-computer-screen-ai-generated-cont-768x98.png 768w, https:\/\/www.rushworth.us\/lisa\/wp-content\/uploads\/2025\/08\/a-close-up-of-a-computer-screen-ai-generated-cont-1536x196.png 1536w, https:\/\/www.rushworth.us\/lisa\/wp-content\/uploads\/2025\/08\/a-close-up-of-a-computer-screen-ai-generated-cont-750x96.png 750w\" sizes=\"auto, (max-width: 1632px) 100vw, 1632px\" \/><\/p>\n<p>Now I no longer have authenticating authorities <em>but<\/em> the AuthnContextClassRef is &#8220;urn:oasis:names:tc:SAML:2.0:ac:classes:Telephony\u201d \u2026 so, in the assertion creation, we need to add SAML_AUTHN_CTX to the attribute contract<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" width=\"950\" height=\"789\" class=\"wp-image-11626\" src=\"https:\/\/www.rushworth.us\/lisa\/wp-content\/uploads\/2025\/08\/a-screenshot-of-a-computer-ai-generated-content-m-1.png\" alt=\"A screenshot of a computer\n\nAI-generated content may be incorrect.\" srcset=\"https:\/\/www.rushworth.us\/lisa\/wp-content\/uploads\/2025\/08\/a-screenshot-of-a-computer-ai-generated-content-m-1.png 950w, https:\/\/www.rushworth.us\/lisa\/wp-content\/uploads\/2025\/08\/a-screenshot-of-a-computer-ai-generated-content-m-1-300x249.png 300w, https:\/\/www.rushworth.us\/lisa\/wp-content\/uploads\/2025\/08\/a-screenshot-of-a-computer-ai-generated-content-m-1-768x638.png 768w, https:\/\/www.rushworth.us\/lisa\/wp-content\/uploads\/2025\/08\/a-screenshot-of-a-computer-ai-generated-content-m-1-750x623.png 750w\" sizes=\"auto, (max-width: 950px) 100vw, 950px\" \/><\/p>\n<p>In the attribute contract fulfillment, map this to a static TEXT string \u2013 I am using \u201curn:oasis:names:tc:SAML:2.0:ac:classes:unspecified\u201d which is used as the default in PingFederate<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" width=\"1315\" height=\"75\" class=\"wp-image-11627\" src=\"https:\/\/www.rushworth.us\/lisa\/wp-content\/uploads\/2025\/08\/word-image-11622-5.png\" srcset=\"https:\/\/www.rushworth.us\/lisa\/wp-content\/uploads\/2025\/08\/word-image-11622-5.png 1315w, https:\/\/www.rushworth.us\/lisa\/wp-content\/uploads\/2025\/08\/word-image-11622-5-300x17.png 300w, https:\/\/www.rushworth.us\/lisa\/wp-content\/uploads\/2025\/08\/word-image-11622-5-1024x58.png 1024w, https:\/\/www.rushworth.us\/lisa\/wp-content\/uploads\/2025\/08\/word-image-11622-5-768x44.png 768w, https:\/\/www.rushworth.us\/lisa\/wp-content\/uploads\/2025\/08\/word-image-11622-5-750x43.png 750w\" sizes=\"auto, (max-width: 1315px) 100vw, 1315px\" \/><\/p>\n<p>Final Answer! I have an AuthnContext that does not contain any invalid URI strings <em>and<\/em> a AuthnContextClassRef that is expected.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" width=\"841\" height=\"62\" class=\"wp-image-11628\" src=\"https:\/\/www.rushworth.us\/lisa\/wp-content\/uploads\/2025\/08\/word-image-11622-6.png\" srcset=\"https:\/\/www.rushworth.us\/lisa\/wp-content\/uploads\/2025\/08\/word-image-11622-6.png 841w, https:\/\/www.rushworth.us\/lisa\/wp-content\/uploads\/2025\/08\/word-image-11622-6-300x22.png 300w, https:\/\/www.rushworth.us\/lisa\/wp-content\/uploads\/2025\/08\/word-image-11622-6-768x57.png 768w, https:\/\/www.rushworth.us\/lisa\/wp-content\/uploads\/2025\/08\/word-image-11622-6-750x55.png 750w\" sizes=\"auto, (max-width: 841px) 100vw, 841px\" \/><\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>After a recent merger, we have added federated authentication in our PingFederate environment that allows the incoming company to continue to use their Entra (ADFS) logon process to authenticate through PingFederate. All of the IDs exist in our directory, and contract attributes are populated based on the local account. But the authentication is handled by &hellip;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2114],"tags":[2116,2115,2117,2118],"class_list":["post-11622","post","type-post","status-publish","format-standard","hentry","category-pingfederate","tag-ognl","tag-ping","tag-pingfed","tag-pingfederate"],"_links":{"self":[{"href":"https:\/\/www.rushworth.us\/lisa\/index.php?rest_route=\/wp\/v2\/posts\/11622","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.rushworth.us\/lisa\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.rushworth.us\/lisa\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.rushworth.us\/lisa\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.rushworth.us\/lisa\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=11622"}],"version-history":[{"count":1,"href":"https:\/\/www.rushworth.us\/lisa\/index.php?rest_route=\/wp\/v2\/posts\/11622\/revisions"}],"predecessor-version":[{"id":11629,"href":"https:\/\/www.rushworth.us\/lisa\/index.php?rest_route=\/wp\/v2\/posts\/11622\/revisions\/11629"}],"wp:attachment":[{"href":"https:\/\/www.rushworth.us\/lisa\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=11622"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.rushworth.us\/lisa\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=11622"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.rushworth.us\/lisa\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=11622"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}