使用 AAD MSAL 登录 - 登录已在进行中

Posted

技术标签:

【中文标题】使用 AAD MSAL 登录 - 登录已在进行中【英文标题】:Login with AAD MSAL - Login is already in progress 【发布时间】:2020-01-26 13:14:27 【问题描述】:

我有一个使用 MSAL 登录的 ASP.net 网站。

我一直遇到的问题是,每当用户登录,然后再次注销时,用户都会被重定向到注销页面。 该页面实现new Msal.UserAgentApplication(msalConfig).logout()功能,将用户重定向回登录页面。

这一切都完美无缺。然后登录页面会自动将用户重定向回 AAD 登录页面。

如果用户随后决定再次登录,MyMsalObject.GetAccount() 的结果将返回 null,并发生错误,其中提及以下内容:

ClientAuthError: Login_In_Progress: 登录调用期间出错 - 登录已在进行中。

起初我使用一个 js 文件来处理登录和注销,然后我意识到这可能不是他最好的解决方案,因为它试图在加载时登录。

所以我决定将它们分成两个单独的 JS 文件,但这并没有解决我的问题。

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);

登录代码:

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

编辑:

一些额外的细节。 我现在已经做到了,用户必须在被重定向到 Microsoft 之前单击一个按钮才能登录。

不幸的是,上述内容仍然适用。第一次成功登录并注销后,第二次登录尝试不会在函数getaccount() 中产生值,即使它第一次运行良好。

我登录后得到的错误仍然是相同的:

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

虽然我刚刚登录..

有人有解决办法吗?

编辑 2:

有一点进展.. 有点,我已经能够通过改变我注销用户的方式来修复上面的错误。

配置文件现在是文档中的一个定义,我已经将注销功能移到了那里。

虽然我现在面临新的挑战..

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

我不完全确定这是前进还是倒退。复制场景保持不变,您登录,然后您注销并再次登录,当微软将用户发送回登录页面时,我收到此编辑中提到的错误,但我第一次没有收到此错误登录尝试。

答案在:https://github.com/AzureAD/microsoft-authentication-library-for-js/wiki/FAQs#q6-how-to-avoid-page-reloads-when-acquiring-and-renewing-tokens-silently 根本没有帮助,我正在使用 chrome 但它仍然无法正常工作..

【问题讨论】:

【参考方案1】:

首先,在使用loginRedirect 时,您需要将在用户重定向回您的应用程序时要运行的代码放在myMsalObj.handleRedirectCallback(callback) 中,而不是在您启动重定向过程的函数中。另请注意,handleRedirectCallback 应在初始页面加载时注册。

例子:


const myMSALObj = new Msal.UserAgentApplication(msalConfig);

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

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

不过,我对您的应用有点困惑。你是说你的应用中有页面只调用myMSALObj.logout()

【讨论】:

页面上还有一些其他的事情会导致用户注销【参考方案2】:

检查会话/本地存储和 cookie 是否有任何悬空的 msal 信息。我们遇到了同样的问题,我偶然发现了这个链接。

https://github.com/AzureAD/microsoft-authentication-library-for-js/issues/1069

它建议清除存储和 cookie,但如果您深入使用浏览器工具,您会看到几个条目,例如“msal...interactive...”。这些将具有“进行中”的值,这就是导致错误的原因。

删除这些条目可以解决问题。

【讨论】:

以上是关于使用 AAD MSAL 登录 - 登录已在进行中的主要内容,如果未能解决你的问题,请参考以下文章

如何使用Azure AD B2C在react-aad-msal中使用“忘记密码”?

登录后如何获取用户名?我正在尝试使用 MSAL(@azure/msal-angular)进行 Azure 登录

如何使用 @azure/msal-angular 获取用户的 AAD 成员资格

如何使用 MSAL.js 为 Azure DevOps 获取有效的 AAD v2 令牌

如何使用MSAL.js为Azure DevOps获取有效的AAD v2令牌

如果用户从 msal .net 代码登录,则无法使用 msal.js 静默获取访问令牌