def saml(): if "saml" not in syllabus.get_config()['authentication_methods']: abort(404) req = prepare_request(request) req['request_uri'] = request.path # hack to ensure to have the correct path and to avoid RelayState loops auth = init_saml_auth(req, saml_config) # if 'sso' in request.args: # return if request.method == "GET": return redirect(auth.login()) else: auth.process_response() errors = auth.get_errors() # Try and check if IdP is using several signature certificates # This is a limitation of python3-saml for cert in saml_config["idp"].get("additionalX509certs", []): if auth.get_last_error_reason( ) == "Signature validation failed. SAML Response rejected": import copy # Change used IdP certificate new_settings = copy.deepcopy(saml_config) new_settings["idp"]["x509cert"] = cert # Retry processing response auth = init_saml_auth(req, new_settings) auth.process_response() errors = auth.get_errors() if len(errors) == 0: attrs = auth.get_attributes() # session['samlNameId'] = auth.get_nameid() # session['samlSessionIndex'] = auth.get_session_index() username = attrs[saml_config['sp']['attrs']['username']][0] realname = attrs[saml_config['sp']['attrs']['realname']][0] email = attrs[saml_config['sp']['attrs']['email']][0] user = User.query.filter(User.email == email).first() if user is None: # The user does not exist in our DB user = User(name=username, full_name=realname, email=email, hash_password=None, change_password_url=None) db_session.add(user) db_session.commit() session["user"] = user.to_dict() session["user"].update({"login_method": "saml"}) self_url = OneLogin_Saml2_Utils.get_self_url(req) if 'RelayState' in request.form and self_url != request.form[ 'RelayState']: return redirect(auth.redirect_to(request.form['RelayState'])) return seeother("/")
def log_out(): if "user" in session: saml = session["user"].get("login_method", None) == "saml" session.pop("user", None) if saml and "singleLogoutService" in saml_config["sp"]: req = prepare_request(request) auth = init_saml_auth(req, saml_config) return redirect(auth.logout()) return seeother('/')
def log_out(): if "user" in session: saml = session["user"].get("login_method", None) == "saml" session.pop("user", None) if saml and "singleLogoutService" in saml_config["sp"]: try: req = prepare_request(request) auth = init_saml_auth(req, saml_config) return redirect(auth.logout()) except OneLogin_Saml2_Error: pass return seeother(session.get("last_visited", "/"))
def metadata(): req = prepare_request(request) auth = init_saml_auth(req, saml_config) settings = auth.get_settings() metadata = settings.get_sp_metadata() errors = settings.validate_metadata(metadata) if len(errors) == 0: resp = make_response(metadata, 200) resp.headers['Content-Type'] = 'text/xml' else: resp = make_response(', '.join(errors), 500) return resp
def saml(): if "saml" not in syllabus.get_config()['authentication_methods']: abort(404) req = prepare_request(request) req['request_uri'] = request.path # hack to ensure to have the correct path and to avoid RelayState loops auth = init_saml_auth(req, saml_config) # if 'sso' in request.args: # return if request.method == "GET": return redirect(auth.login()) elif 'acs' in request.args: auth.process_response() errors = auth.get_errors() if len(errors) == 0: attrs = auth.get_attributes() # session['samlNameId'] = auth.get_nameid() # session['samlSessionIndex'] = auth.get_session_index() username = attrs[saml_config['sp']['attrs']['username']][0] realname = attrs[saml_config['sp']['attrs']['realname']][0] email = attrs[saml_config['sp']['attrs']['email']][0] user = User.query.filter(User.email == email).first() if user is None: # The user does not exist in our DB user = User(name=username, full_name=realname, email=email, hash_password=None, change_password_url=None) db_session.add(user) db_session.commit() session["user"] = user.to_dict() session["user"].update({"login_method": "saml"}) self_url = OneLogin_Saml2_Utils.get_self_url(req) if 'RelayState' in request.form and self_url != request.form[ 'RelayState']: return redirect(auth.redirect_to(request.form['RelayState'])) return seeother("/")