AcquireTokenSilentAsync 无法对用户进行身份验证

AcquireTokenSilentAsync fails to authenticate user

我正在尝试获取静默令牌请求以初始化 ConfidentialClientApp 对象,如 'Microsoft Graph SDK ASPNET Connect' 项目中所述并在 Add sign-in with Microsoft to an ASP.NET web app

中概述

我的代码反映了上面的示例,我希望我的调用将 return 成功并可以访问。

var result = await cca.AcquireTokenSilentAsync(graphScopes, cca.Users.First());

return result.AccessToken;

但是,我收到一条错误消息,提示用户需要进行身份验证。我不确定在这些例子中我遗漏了什么。

如果该用户已经有包含您请求的范围的缓存令牌,您只能静默获取令牌(它可以有更多,但至少需要有您所请求的内容) .

这就是为什么 AcquireTokenSilentAsync 应该始终包含在 Try/Catch 块中的原因。如果找不到匹配的令牌,则需要启动交互式流程。这是来自 MSAL Wiki:

的示例
AuthenticationResult result = null;
try
{
    result = await app.AcquireTokenSilentAsync(scopes, app.Users.FirstOrDefault());
}
catch (MsalUiRequiredException ex)
{
    // A MsalUiRequiredException happened on AcquireTokenSilentAsync. 
    // This indicates you need to call AcquireTokenAsync to acquire a token
    System.Diagnostics.Debug.WriteLine($"MsalUiRequiredException: {ex.Message}");

    try
    {
        result = await app.AcquireTokenAsync(scopes);
    }
    catch (MsalException msalex)
    {
        ResultText.Text = $"Error Acquiring Token:{System.Environment.NewLine}{msalex}";
    }
}
catch (Exception ex)
{
    ResultText.Text = $"Error Acquiring Token Silently:{System.Environment.NewLine}{ex}";
    return;
}

if (result != null)
{
    string accessToken = result.AccessToken;
    // Use the token
}