MSAL AcquireTokenWithDeviceCode ExecuteAsync 挂起

MSAL AcquireTokenWithDeviceCode ExecuteAsync hangs

我调用 AcquireTokenWithDeviceCode 并在 returned 对象上使用 ExecuteAsync() 从未 return。

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

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

我正在使用 Visual Studio Enterprise 2019 16.7.0,带有 Microsoft.Identity.Client 4.18.0 NuGet 包。 TargetFramework 项目是 .NET Framework 4.7.2,是一个简单的 Windows 应用程序,带有一个“运行”按钮,使用 PublicClientApplicationBuilder 创建下面源代码中引用的 pca 对象。此外,应用程序在 Azure 中设置为将应用程序视为 public 客户端,并且(唯一的)重定向 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;
}

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

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

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