我正在尝试在使用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}");
}
答案 0 :(得分:1)
使用ADAL,您的应用将在最终用户首次使用OpenID Connect ASP.Net OWIN中间件和ADAL .Net登录时获取访问和刷新令牌。请参阅代码示例here,在OnAuthorizationCodeReceived
通知中,它将获取访问令牌并刷新令牌并将其置于缓存实例中。
下次您可以使用AcquireTokenSilentAsync
获取安全令牌而无需询问用户凭据。它将检查令牌缓存并确认访问令牌的生命周期,如果仍然有效,则从缓存中返回该访问令牌。如果它看到它已过期,那么它将使用刷新令牌为您获取新的访问令牌。
但是如果您在应用程序首次获取访问权限之前调用AcquireTokenSilentAsync
并在登录时刷新令牌并将它们放在缓存实例中,或者如果您无法使用完全相同的缓存实例初始化AuthenticationContext,请求将失败。然后,您应该在显示代码时发出新的OWIN质询。