APM SAML IdP - SP Issuer Extraction
Problem this snippet solves:
APM doesn't expose any detail about the SAML SP Issuer when authentication requests hitting APM as an IdP during an SP initiated SAMLRequest. This iRule when applied to a SAML IdP enabled virtual server will extract the assertion request, decode it and present the SAML SP Issuer ID as the session variable %{session.saml.request.issuer} within APM.
How to use this snippet:
This comes in real handy when performing authorisation of the resource and could help avoid having APM perform a TCP connection reset when a SAML resource isn't authorised.
Code :
when CLIENT_ACCEPTED {
ACCESS::restrict_irule_events disable
}
when HTTP_REQUEST {
if { [HTTP::path] equals "/saml/idp/profile/redirectorpost/sso" } {
if { [HTTP::method] equals "POST" } {
# Colelct POST data
set content_length [HTTP::header value Content-Length]
HTTP::collect $content_length
} elseif { [HTTP::method] equals "GET" } {
#TODO
}
}
}
when HTTP_REQUEST_DATA {
set payload_data [URI::decode [HTTP::payload]]
log local0. "payload=[URI::query "?$payload_data" "SAMLRequest"]"
if { $payload_data contains "SAMLRequest" } {
# Extract SAML request data
set SAMLdata [b64decode [URI::query "?$payload_data" "SAMLRequest"]]
set SAML_Issuer_loc [string first "saml:issuer" [string tolower $SAMLdata]]
set SAML_Issuer_start [expr {[string first ">" $SAMLdata $SAML_Issuer_loc] + 1}]
set SAML_Issuer_end [expr {[string first "<" $SAMLdata $SAML_Issuer_start] - 1}]
set SAML_Issuer [string range $SAMLdata $SAML_Issuer_start $SAML_Issuer_end]
if { !([ACCESS::session sid] equals "" ) } {
ACCESS::session data set session.saml.request.issuer $SAML_Issuer
}
}
}
when ACCESS_SESSION_STARTED {
if { [info exists SAML_Issuer] } {
ACCESS::session data set session.saml.request.issuer $SAML_Issuer
}
}Tested this on version:
11.67 Comments
- Walter_Kacynski
Cirrostratus
I would like to note that BIG-IP 13.1 friendly messages are displayed when SAML resources are denied.
Message: "Access to requested SAML resource is denied."
- svs
Cirrostratus
Hi Nobby,
thank you very much! This works like charm in v13 as well and helped me a lot.
Cheers, svs
- Brian
Nimbostratus
Any possibility of getting the GET method solution?
- svs
Cirrostratus
What do you mean? Redirect Binding? Just try to fetch the Request by extracting the URL parameter using HTTP::query i.e. There are a bunch of examples for extracting URL parameters on DevCentral.
- Kris__109062
Nimbostratus
you can't deflate in an irule (that I know of)
You need to urldecode, deflate & base64decode when the SAML SP uses Redirect Binding
I used this to get started and then found out I needed deflate.
set get_payload_data [b64decode [URI::decode [URI::query [HTTP::uri] SAMLRequest]]]
Also, I needed to update the original irule here because some SP's Auth request looked like this..
saml2:issuer
.. which didn't match so I changed to..
set SAML_Issuer_loc [string first ":issuer" [string tolower $SAMLdata]]
- Jad_Tabbara__J1
Cirrostratus
Hello Nobby.
Thanks for sharing very usefull.
I used it on for Azure Office 365 Integration but I adapt it a little bit because the SAML Request does not contain "saml:issuer"
but instead "<issuer" so I have change the following line
set SAML_Issuer_loc [string first "saml:issuer" [string tolower $SAMLdata]]by the following line
set SAML_Issuer_loc [string first "<issuer" [string tolower $SAMLdata]]After that, I was able to extract the SAML SP "Issuer" value.
Regards
- ebeng
Nimbostratus
Did someone ever figured out the part with the GET part, where the SSO SAML is initiated with a HTTP GET?
Also has someone got an idea, once the response is signed, how can we see this content? even with SAML-Tracer I'm not able to decode the base64encoded SAMLRequest string to something readable, but the tool itself can read the SAMLRequest.
Help guide the future of your DevCentral Community!
What tools do you use to collaborate? (1min - anonymous)