@@ -2,19 +2,18 @@ class SamlController < ApplicationController
22 skip_before_action :verify_authenticity_token , :only => [ :acs , :logout ]
33
44 def index
5- render :action => :index
5+ @attrs = [ ]
66 end
77
88 def sso
99 settings = Account . get_saml_settings
1010 if settings . nil?
1111 render :action => :no_settings
12- return
12+ return
1313 end
1414
1515 request = OneLogin ::RubySaml ::Authrequest . new
1616 redirect_to ( request . create ( settings ) )
17- # redirect_to(request.create(saml_settings, {:RelayState => session[:return_to]}))
1817
1918 end
2019
@@ -25,10 +24,10 @@ def acs
2524 logger . info "NAMEID: #{ response . name_id } "
2625
2726 if response . is_valid?
28- session [ :userid ] = response . name_id
27+ session [ :user_id ] = response . name_id
2928 session [ :attributes ] = response . attributes
3029 @attrs = session [ :attributes ]
31- render :action => :complete
30+ redirect_to root_path
3231 else
3332 render :action => :fail
3433 end
@@ -42,17 +41,17 @@ def metadata
4241
4342 # Trigger SP and IdP initiated Logout requests
4443 def logout
45- # If we're given a logout request, handle it in the IdP initiated method
44+ # If we're given a logout request, handle it in the IdP logout initiated method
4645 if params [ :SAMLRequest ]
4746 return idp_logout_request
48-
49- # We've been given a response back from the IdP
47+
48+ # We've been given a response back from the IdP
5049 elsif params [ :SAMLResponse ]
51- return logout_response
50+ return process_logout_response
5251 elsif params [ :slo ]
5352 return sp_logout_request
5453 else
55- delete_session
54+ reset_session
5655 end
5756 end
5857
@@ -63,17 +62,17 @@ def sp_logout_request
6362
6463 if settings . idp_slo_target_url . nil?
6564 logger . info "SLO IdP Endpoint not found in settings, executing then a normal logout'"
66- delete_session
65+ reset_session
6766 else
6867
6968 # Since we created a new SAML request, save the transaction_id
7069 # to compare it with the response we get back
7170 logout_request = OneLogin ::RubySaml ::Logoutrequest . new ( )
7271 session [ :transaction_id ] = logout_request . uuid
73- logger . info "New SP SLO for userid '#{ session [ :userid ] } ' transactionid '#{ session [ :transaction_id ] } '"
72+ logger . info "New SP SLO for User ID: '#{ session [ :user_id ] } ', Transaction ID: '#{ session [ :transaction_id ] } '"
7473
7574 if settings . name_identifier_value . nil?
76- settings . name_identifier_value = session [ :userid ]
75+ settings . name_identifier_value = session [ :user_id ]
7776 end
7877
7978 relayState = url_for controller : 'saml' , action : 'index'
@@ -83,12 +82,12 @@ def sp_logout_request
8382
8483 # After sending an SP initiated LogoutRequest to the IdP, we need to accept
8584 # the LogoutResponse, verify it, then actually delete our session.
86- def logout_response
85+ def process_logout_response
8786 settings = Account . get_saml_settings
8887
8988 if session . has_key? :transation_id
9089 logout_response = OneLogin ::RubySaml ::Logoutresponse . new ( params [ :SAMLResponse ] , settings , :matches_request_id => session [ :transation_id ] )
91- else
90+ else
9291 logout_response = OneLogin ::RubySaml ::Logoutresponse . new ( params [ :SAMLResponse ] , settings )
9392 end
9493
@@ -100,30 +99,24 @@ def logout_response
10099 else
101100 # Actually log out this session
102101 if logout_response . success?
103- logger . info "Delete session for '#{ session [ :userid ] } '"
104- delete_session
102+ logger . info "Delete session for '#{ session [ :user_id ] } '"
103+ reset_session
105104 end
106105 end
107106 end
108107
109108 # Method to handle IdP initiated logouts
110109 def idp_logout_request
111-
112- render :inline => "IdP initiated Logout not supported"
113-
114- #settings = Account.get_saml_settings
115- #logout_request = OneLogin::RubySaml::Logoutrequest.new(params[:SAMLRequest],settings)
116- #unless logout_request.is_valid?
117- # logger.error "IdP initiated LogoutRequest was not valid!"
118- #end
119- # Check that the name ID's match
120- #if session[:userid] != logout_request.name_id
121- # logger.error "The session's Name ID '#{session[:userid]}' does not match the LogoutRequest's Name ID '#{logout_request.name_id}'"
122- #end
123- #logger.info "IdP initiated Logout for #{logout_request.name_id}"
110+ settings = Account . get_saml_settings
111+ logout_request = OneLogin ::RubySaml ::SloLogoutrequest . new ( params [ :SAMLRequest ] )
112+ if !logout_request . is_valid?
113+ logger . error "IdP initiated LogoutRequest was not valid!"
114+ render :inline => logger . error
115+ end
116+ logger . info "IdP initiated Logout for #{ logout_request . name_id } "
124117
125118 # Actually log out this session
126- #delete_session
119+ reset_session
127120
128121 # Generate a response to the IdP. :transaction_id sets the InResponseTo
129122 # SAML message to create a reply to the IdP in the LogoutResponse.
@@ -137,13 +130,10 @@ def idp_logout_request
137130 # when "POST"
138131 # # for POST requests (form) render the content as HTML
139132 # render :inline => content
140- #end
141- end
133+ #end logout_request_id = logout_request.id
142134
143- # Delete a user's session. Add your own custom stuff in here
144- def delete_session
145- session [ :userid ] = nil
146- session [ :attributes ] = nil
135+ logout_response = OneLogin ::RubySaml ::SloLogoutresponse . new . create ( settings , logout_request_id , nil , :RelayState => params [ :RelayState ] )
136+ redirect_to logout_response
147137 end
148138
149139end
0 commit comments