MSAL AcquireTokenWithDeviceCode ExecuteAsync 挂起

Posted

技术标签:

【中文标题】MSAL AcquireTokenWithDeviceCode ExecuteAsync 挂起【英文标题】:MSAL AcquireTokenWithDeviceCode ExecuteAsync hangs 【发布时间】:2020-12-27 07:31:11 【问题描述】:

我对 AcquireTokenWithDeviceCode 的调用并在返回的对象上使用 ExecuteAsync() 永远不会返回。

deviceCodeResultCallback 中的断点按预期命中,我确实在 deviceCodeResult 对象 Message 属性中获得了打开 https://microsoft.com/devicelogin 并输入代码 XXXXXXXX 进行身份验证的说明。在调试器中按 Continue 然后使用 fiddler 后,我可以看到正在等待我批准请求的范围访问的定期请求,在等待批准时它会收到预期的 authorization_pending 错误。在使用上述 URL 在浏览器中成功授权帐户范围后,Fiddler 在其最后记录的 HTTP 调用中获取包含 access_token、client_token 等的 JSON。但是,ExecuteAsync() 调用永远不会返回。看来预期的结果应该是一个 Task 对象。下面是我为实验运行的代码。在“返回结果”上设置了断点;和“返回空值;”行,以及所有 CLR 异常都被捕获。

值得注意的是,在上述成功验证后,如果我暂停程序并深入了解 pca.UserTokenCache,我确实会看到该帐户显示在包含所有预期信息的集合中,即 ClientName、Token 等。

我正在使用带有 Microsoft.Identity.Client 4.18.0 NuGet 包的 Visual Studio Enterprise 2019 16.7.0。 TargetFramework 项目是 .NET Framework 4.7.2,是一个简单的 Windows 应用程序,带有一个“运行”按钮,该按钮使用 PublicClientApplicationBuilder 创建下面源代码中引用的 pca 对象。此外,应用程序在 Azure 中设置为将应用程序视为公共客户端,并且(唯一的)重定向 URI 设置为 https://login.microsoftonline.com/common/oauth2/nativeclient。

try

    var result = await pca.AcquireTokenWithDeviceCode(scopes,
        deviceCodeResult =>
        
            Debug.WriteLine(deviceCodeResult.Message);
            return Task.FromResult(0);
        ).ExecuteAsync();

    Debug.WriteLine(result.Account.Username);

    return result;

catch (MsalServiceException)

    return null;

catch (OperationCanceledException)

    return null;

catch (MsalClientException)

    return null;

catch

    return null;

我确定我遗漏了一些概念,但已经没有明显的想法了。感谢您的帮助。

【问题讨论】:

【参考方案1】:

原始线程可能正忙于使同步上下文不可用。请尝试以下操作:

var result = await pca.AcquireTokenWithDeviceCode(scopes,
    deviceCodeResult =>
    
        Debug.WriteLine(deviceCodeResult.Message);
        return Task.FromResult(0);
    ).ExecuteAsync().ConfigureAwait(false);

【讨论】:

做到了!谢谢阿尔弗雷多。很可能需要 ConfigureAwait() 调用,因为该调用是在 WinForms 按钮单击方法中进行的。有关“为什么”的更多详细信息,Microsoft .NET 博客有一篇名为“ConfigureAwait FAQ”的帖子。此时的链接是:https://devblogs.microsoft.com/dotnet/configureawait-faq/ @jmullis 不客气!感谢您提供额外的信息。

以上是关于MSAL AcquireTokenWithDeviceCode ExecuteAsync 挂起的主要内容,如果未能解决你的问题,请参考以下文章

AcquireTokenForClient (MSAL) 是不是使用令牌缓存?

不记名令牌未添加到 HTTP 请求 - MSAL2 Angular

“npm install @azure/msal-browser @azure/msal-angular@latest”,但 node_modules 内没有

将项目发布到 Azure VM 时不会弹出 MSAL

访问 vue 外部的 vue-msal 插件暴露对象

ADAL 到 MSAL 迁移保护 Web API