无法以静默方式获取令牌。调用方法AcquireToken

时间:2017-10-09 13:19:33

标签: asp.net model-view-controller azure-active-directory microsoft-graph

我正在尝试在使用Microsoft Graph时对用户进行身份验证,并不断收到错误Failed to acquire token silently. Call method AcquireToken

任何想法如何解决这个问题?

try
{
    AuthenticationResult result =
        await authContext.AcquireTokenSilentAsync(SettingsHelper.GraphResourceId,
            clientCredential,
            userId);
    return result.AccessToken;
}
// Unable to retrieve the access token silently.
catch (AdalException ex)
{
    HttpContext.Current.Request.GetOwinContext().Authentication.Challenge(
        new AuthenticationProperties() { RedirectUri = "/" },
        OpenIdConnectAuthenticationDefaults.AuthenticationType);

    throw new Exception(Resource.Error_AuthChallengeNeeded + $" {ex.Message}");
}

1 个答案:

答案 0 :(得分:1)

使用ADAL,您的应用将在最终用户首次使用OpenID Connect ASP.Net OWIN中间件和ADAL .Net登录时获取访问和刷新令牌。请参阅代码示例here,在OnAuthorizationCodeReceived通知中,它将获取访问令牌并刷新令牌并将其置于缓存实例中。

下次您可以使用AcquireTokenSilentAsync获取安全令牌而无需询问用户凭据。它将检查令牌缓存并确认访问令牌的生命周期,如果仍然有效,则从缓存中返回该访问令牌。如果它看到它已过期,那么它将使用刷新令牌为您获取新的访问令牌。

但是如果您在应用程序首次获取访问权限之前调用AcquireTokenSilentAsync并在登录时刷新令牌并将它们放在缓存实例中,或者如果您无法使用完全相同的缓存实例初始化AuthenticationContext,请求将失败。然后,您应该在显示代码时发出新的OWIN质询。