C# MSAL AcquireTokenWithDeviceCode ExecuteAsync挂起

C# MSAL AcquireTokenWithDeviceCode ExecuteAsync挂起,c#,azure,graph,msal,C#,Azure,Graph,Msal,我对AcquireTokenWithDeviceCode的调用以及对返回对象使用ExecuteAsync()的调用从未返回 deviceCodeResultCallback中的断点按预期命中,我确实在deviceCodeResult对象消息属性中获得了打开并输入代码XXXXXXXX进行身份验证的指令。在调试器中按Continue,然后使用fiddler之后,我可以看到周期性的请求正在等待我批准所请求的scopes访问,在等待批准时,它会收到预期的授权错误。在使用上述URL在浏览器中成功授权帐户的

我对AcquireTokenWithDeviceCode的调用以及对返回对象使用ExecuteAsync()的调用从未返回

deviceCodeResultCallback中的断点按预期命中,我确实在deviceCodeResult对象消息属性中获得了打开并输入代码XXXXXXXX进行身份验证的指令。在调试器中按Continue,然后使用fiddler之后,我可以看到周期性的请求正在等待我批准所请求的scopes访问,在等待批准时,它会收到预期的授权错误。在使用上述URL在浏览器中成功授权帐户的作用域后,Fiddler在其上次记录的HTTP调用中获取包含access_令牌、client_令牌等的JSON。但是,ExecuteAsync()调用永远不会返回。预期结果似乎应该是任务对象。下面是我为我的实验运行的代码。“return result;”和“return null;”行上设置了断点,并且捕获了所有CLR异常

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

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

试试看
{
var结果=等待pca.AcquireTokenWithDeviceCode(作用域,
deviceCodeResult=>
{
Debug.WriteLine(deviceCodeResult.Message);
返回Task.FromResult(0);
}).ExecuteAsync();
Debug.WriteLine(result.Account.Username);
返回结果;
}
捕获(MsalServiceException)
{
返回null;
}
捕获(操作取消异常)
{
返回null;
}
捕获(MsalClientException)
{
返回null;
}
抓住
{
返回null;
}

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

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

var result=等待pca.AcquireTokenWithDeviceCode(作用域,
deviceCodeResult=>
{
Debug.WriteLine(deviceCodeResult.Message);
返回Task.FromResult(0);
}).ExecuteAsync().ConfigureAwait(false);

成功了!谢谢阿尔弗雷多。最有可能需要ConfigureWait()调用,因为该调用是在WinForms按钮单击方法中进行的。有关“为什么”的更多详细信息,Microsoft.NET博客上有一篇名为“ConfigureWait FAQ”的帖子。现在的链接是:@jmullis不客气!谢谢你提供的额外信息。