APM as ADFS proxy in front of ADFS server 3.0 for O365
Problem this snippet solves:
When deploying APM as ADFS proxy in front of ADFS server, there are some issues :
- user agent different than Internet Explorer are redirected to ADFS form based authentication after APM auth
- Logout URI is not managed by APM. users disconnected from Office 365 are not disconnected from APM
- users who are still authenticated on O365 but with expired session on APM are prompted to authenticate on APM when disconnecting from O365
- When authentication fails, APM display logout page with redirect to /. when user authenticate next time, ADFS server respond with 404 error code.
- When User try to connect to access URI /, ADFS server respond with 404 error code.
This irule change the APM behavior to optimize user experience.
to solve HTTP error 404, user trying to access / or session denied are redirected to https://portal.office.com
Note : Next step is to extract SAML relay state from request and redirect dynamically 404 error to relay state instead of fixed URL.
How to use this snippet:
Enable this irule on the virtual server.
Code :
when ACCESS_ACL_ALLOWED { # Change user-Agent to Internet Explorer 11 User-Agent HTTP::header replace "User-Agent" "Mozilla/5.0 (Windows NT 10.0; Trident/7.0; rv:11.0) like Gecko msie7" # If authenticated request matches ADFS SLO URI, close APM session and redirect to URI stored in query parameter "wreply" if { ([string tolower [HTTP::path]] equals "/adfs/ls/") && ([string tolower [URI::query [HTTP::uri] wa]] equals "wsignout1.0") } { set redirect_uri [URI::decode [URI::query [HTTP::uri] wreply]] ACCESS::session remove ACCESS::respond 302 noserver Location $redirect_uri return } } when ACCESS_SESSION_STARTED { # If new session matches ADFS SLO URI, close APM session and redirect to URI stored in query parameter "wreply" set landinguri [ACCESS::session data get session.server.landinguri] if { ([string tolower $landinguri] starts_with "/adfs/ls/") && ([string tolower [URI::query $landinguri wa]] equals "wsignout1.0") } { set redirect_uri [URI::decode [URI::query $landinguri wreply]] ACCESS::respond 302 noserver Location $redirect_uri ACCESS::session remove return } elseif {!([string tolower $landinguri] starts_with "/adfs/")} { ACCESS::respond 302 noserver Location "https://portal.office.com" ACCESS::session remove } } when ACCESS_POLICY_COMPLETED { if { ([ACCESS::policy result] equals "deny") } { ACCESS::respond 302 noserver Location "https://portal.office.com" ACCESS::session remove } }
Tested this on version:
12.0Published Sep 19, 2016
Version 1.0Stanislas_Piro2
Cumulonimbus
Joined January 04, 2011
Stanislas_Piro2
Cumulonimbus
Joined January 04, 2011
No CommentsBe the first to comment