Projet

Général

Profil

Actions

Fonctionnalité #32418

ouvert

[BACK] Propriété HEADER pour connexion SSO Classique

Ajouté par Arnaud PAUGET il y a 12 jours. Mis à jour il y a un jour.

Statut:
R&D - A étudier
Priorité:
1-Majeur
Assigné à:
Version cible:
-
Début:
10/02/2025
Echéance:

Description

Besoin

En tant qu'administrateur technique, je veux pouvoir choisir quel nom de HEADER envoyé par la requête HTTP est exactement utilisé pour le rapprochement avec le user_id de Maarch Courrier afin d'initier la connexion SSO.

Détails

Actuellement dans Maarch Courrier il est possible de paramétrer le mode d'authentification SSO. Ce mode permet de rapprocher une propriété reçue dans les HEADERS HTTP ou une variable de session renvoyé par Apache après connexion pour connecter l'utilisateur avec son user_id.
Cependant, il n'est en fait pas possible de paramétrer quelle variable de session est attendue exactement.

Code Courrier dans AuthenticationController.php :

`private static function ssoConnection(): array
{
$ssoConfiguration = ConfigurationModel::getByPrivilege(['privilege' => 'admin_sso', 'select' => ['value']]);
if (empty($ssoConfiguration['value'])) {
return ['errors' => 'Sso configuration missing'];
}

    $ssoConfiguration = json_decode($ssoConfiguration['value'], true);
    $mapping = array_column($ssoConfiguration['mapping'], 'ssoId', 'maarchId');
    if (empty($mapping['login'])) {
        return ['errors' => 'Sso configuration missing : no login mapping'];
    }

    if (in_array(strtoupper($mapping['login']), ['REMOTE_USER', 'PHP_AUTH_USER'])) {
        $login = $_SERVER[strtoupper($mapping['login'])] ?? null;
    } else {
        $login = $_SERVER['HTTP_' . strtoupper($mapping['login'])] ?? null;
    }
    if (empty($login)) {
        $headers = [];
        $apacheHeaders = apache_request_headers();
        if (!empty($apacheHeaders)) {
            foreach ($apacheHeaders as $key => $value) {
                $headers[strtoupper($key)] = $value;
            }
        }
        $login = $headers[strtoupper($mapping['login'])] ?? null;
    }
    if (empty($login)) {
        return ['errors' => 'Authentication Failed : login not present in header'];
    }

    return ['login' => $login];
}`

Traitement recherche variable $_SERVER :

Ici nous remarquons que seule REMOTE_USER ou PHP_AUTH_USER seront rapproché si nous avons mis ces valeurs dans le paramétrage, sinon, nous cherchons une correspondance avec un prefixe "HTTP_". Or, dans certain cas, la variable serveur renvoyé par Apache peut être "REDIRECT_Login". Si tel est le cas, il est impossible de la rapprocher.

Nous remarquons également que la fonction strtoupper() est systématiquement appelée sur la clé recherchée, empêchant donc la définition d'une variable en minuscule par recherche. Avec toujours pour exemple : "REDIRECT_Login".

Proposition d'amélioration

Dans le cas où aucun des cas ci-dessus ne récupère une valeur pour alimenter la variable $login, il faudrait essayer de faire une comparaison stricte entre une variable de SESSION et la valeur configuré dans le paramétrage. Exemple, avant le
if (empty($login)) { return ['errors' => 'Authentication Failed : login not present in header']; }:

Faire :
if (empty($login)) { $login = $_SERVER[$mapping['login']] ?? null; }

Mis à jour par Agnes GASTAMBIDE il y a 12 jours

  • Statut changé de A qualifier à R&D - A étudier

Mis à jour par Agnes GASTAMBIDE il y a un jour

  • Tracker changé de Anomalie à Fonctionnalité
Actions

Formats disponibles : Atom PDF