@@ -436,21 +436,24 @@ def logout(request, config_loader_path=None):
436
436
'The session does not contain the subject id for user %s' ,
437
437
request .user )
438
438
439
+ result = dict ()
439
440
try :
440
441
result = client .global_logout (subject_id )
441
442
except LogoutError as exp :
442
443
logger .exception ('Error Handled - SLO not supported by IDP: {}' .format (exp ))
443
- auth .logout (request )
444
+ # logout
445
+ _do_local_logout (request )
444
446
state .sync ()
445
- return HttpResponseRedirect ('/' )
447
+ return HttpResponseRedirect (settings . LOGOUT_REDIRECT_URL )
446
448
449
+ # user locally logged out for prudence, indipendently by IdP behaviour
450
+ _do_local_logout (request )
447
451
state .sync ()
448
452
449
453
if not result :
450
454
logger .error ("Looks like the user %s is not logged in any IdP/AA" , subject_id )
451
455
return HttpResponseBadRequest ("You are not logged in any IdP/AA" )
452
-
453
- if len (result ) > 1 :
456
+ elif len (result ) > 1 :
454
457
logger .error ('Sorry, I do not know how to logout from several sources. I will logout just from the first one' )
455
458
456
459
for entityid , logout_info in result .items ():
@@ -470,7 +473,7 @@ def logout(request, config_loader_path=None):
470
473
# We must have had a soap logout
471
474
return finish_logout (request , logout_info )
472
475
473
- logger .error ('Could not logout because there only the HTTP_REDIRECT is supported' )
476
+ logger .error ('Could not logout because Logout Binding is not supported' )
474
477
return HttpResponseServerError ('Logout Binding not supported' )
475
478
476
479
@@ -480,7 +483,15 @@ def logout_service(request, *args, **kwargs):
480
483
481
484
@csrf_exempt
482
485
def logout_service_post (request , * args , ** kwargs ):
483
- return do_logout_service (request , request .POST , BINDING_HTTP_POST , * args , ** kwargs )
486
+ try :
487
+ return do_logout_service (request , request .POST , BINDING_HTTP_POST , * args , ** kwargs )
488
+ except Exception as e :
489
+ logging .error ('Logout Service Post: {}' .format (e ))
490
+
491
+
492
+ def _do_local_logout (request ):
493
+ if request .user .is_authenticated :
494
+ auth .logout (request )
484
495
485
496
486
497
def do_logout_service (request , data , binding , config_loader_path = None , next_page = None ,
@@ -509,12 +520,13 @@ def do_logout_service(request, data, binding, config_loader_path=None, next_page
509
520
510
521
elif 'SAMLRequest' in data : # logout started by the IdP
511
522
logger .debug ('Receiving a logout request from the IdP' )
512
- subject_id = _get_subject_id (request .session )
523
+ subject_id = _get_subject_id (request .session ) if hasattr (request , 'session' ) else None
524
+
513
525
if subject_id is None :
514
526
logger .warning (
515
527
'The session does not contain the subject id for user %s. Performing local logout' ,
516
528
request .user )
517
- auth . logout (request )
529
+ _do_local_logout (request )
518
530
return render (request , logout_error_template , status = 403 )
519
531
else :
520
532
http_info = client .handle_logout_request (
@@ -523,7 +535,10 @@ def do_logout_service(request, data, binding, config_loader_path=None, next_page
523
535
binding ,
524
536
relay_state = data .get ('RelayState' , '' ))
525
537
state .sync ()
526
- auth .logout (request )
538
+
539
+ # logout
540
+ _do_local_logout (request )
541
+
527
542
if (
528
543
http_info .get ('method' , 'GET' ) == 'POST' and
529
544
'data' in http_info and
0 commit comments