web-dev-qa-db-fra.com

Connectez-vous avec AAD MSAL - La connexion est déjà en cours

J'ai un site Web ASP.net, qui utilise MSAL pour se connecter.

Le problème que je continue d'avoir est que, chaque fois que l'utilisateur se connecte, puis se déconnecte à nouveau, l'utilisateur est redirigé vers une page de déconnexion. Cette page implémente la fonction new Msal.UserAgentApplication(msalConfig).logout() et redirige l'utilisateur vers la page de connexion.

Tout cela fonctionne parfaitement. La page de connexion redirige ensuite automatiquement l'utilisateur vers la page de connexion AAD.

Si l'utilisateur décide ensuite de se reconnecter, le résultat de MyMsalObject.GetAccount() renvoie null et une erreur se produit qui mentionne ce qui suit:

ClientAuthError: Login_In_Progress: erreur lors de l'appel de connexion - la connexion est déjà en cours.

Au début, j'ai utilisé un fichier js pour gérer la connexion et la déconnexion, j'ai ensuite réalisé que ce n'était probablement pas la meilleure solution, car il a tenté une connexion à la charge.

J'ai donc décidé de les diviser en deux fichiers JS distincts, mais cela n'a pas résolu mon problème.

définition msalObject:

var msalConfig = {
    auth: {
        clientId: "my_client_id",
        authority: "my_authority_url",
        redirectUri: "http://localhost:port"
    },
    cache: {
        cacheLocation: "localStorage",
        storeAuthStateInCookie: true
    }
};

var myMSALObj = new Msal.UserAgentApplication(msalConfig);

code de connexion:

$(document).ready(function(){
    if (!myMSALObj.getAccount()) {
            myMSALObj.loginRedirect(msalConfig);
            acquireTokenRedirectAndCallMSGraph();
    }
});

Éditer:

Quelques détails supplémentaires. J'ai maintenant fait en sorte que les utilisateurs doivent cliquer sur un bouton avant d'être redirigés vers Microsoft pour se connecter.

Ce qui précède s'applique malheureusement toujours. Après une connexion réussie pour la première fois et une déconnexion, une tentative de connexion secondaire ne donnera pas de valeur dans la fonction getaccount() même si cela fonctionne parfaitement la première fois.

L'erreur que j'obtiens après m'être connecté est toujours la même, à savoir:

ClientAuthError: Login_In_Progress: Error during login call - login is already in progress.

Même si je viens de me connecter ..

Quelqu'un a-t-il une solution?

Modifier 2:

Il y a un peu de progrès .. en quelque sorte, j'ai pu corriger l'erreur ci-dessus en changeant la façon dont je déconnecte l'utilisateur.

Le fichier de configuration est maintenant une définition dans le document prêt et j'ai également déplacé la fonction de déconnexion.

Bien que je fasse maintenant face à un nouveau défi ..

Refused to display 'https://login.microsoftonline.com/{{}}' in a frame because it set 'X-Frame-Options' to 'deny'.

Et je ne suis pas tout à fait sûr que ce soit un pas en avant ou en arrière. Le scénario de reproduction reste le même, vous vous connectez, puis vous vous déconnectez et vous reconnectez, lorsque Microsoft renvoie l'utilisateur à la page de connexion, j'obtiens l'erreur mentionnée dans cette modification, mais je n'obtiens pas cette erreur le 1er tentative de connexion.

La réponse a indiqué le: https://github.com/AzureAD/Microsoft-authentication-library-for-js/wiki/FAQs#q6-how-to-avoid-page-reloads-when-acquiring-and -renewing-tokens-silently n'aide pas du tout, j'utilise chrome mais ça ne marche toujours pas ..

4
Gerwin

Tout d'abord, lorsque vous utilisez loginRedirect, vous devez mettre le code que vous souhaitez exécuter lorsque l'utilisateur est redirigé vers votre application dans myMsalObj.handleRedirectCallback(callback) au lieu de l'intérieur de la fonction où vous lancez le processus de redirection. Notez également que handleRedirectCallback doit être enregistré lors du chargement initial de la page.

Exemple:


const myMSALObj = new Msal.UserAgentApplication(msalConfig);

$(document).ready(function(){
    myMSALObj.handleRedirectCallback(function(error, response) {
        var account = myMSALObj.getAcccount();

        if (account) {
            // user is logged in
        }
    });
});

Je suis cependant un peu confus au sujet de votre application. Voulez-vous dire que votre application contient une page qui appelle simplement myMSALObj.logout()?

0
jasonnutter