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);
我调用 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);