Nous travaillons sur un projet ASP.NET MVC à l'aide de l'API Microsoft Graph. Il est fortement basé sur l'exemple de code à https://github.com/microsoftgraph/aspnet-snippets-sample. L'application fonctionne bien au début - nous pouvons nous connecter en utilisant notre compte de locataire et obtenir des données à partir du graphique. Cependant, si nous commençons une nouvelle session de Visual Studio ou si nous attendons un certain temps, AcquireTokenSilentAsync
lancers francsImpossible d'acquérir le jeton en mode silencieux - API Microsoft Graph
pas parvenus à acquérir jeton en silence
Si le cache du navigateur Web est effacé il fonctionne à nouveau, mais après un certain temps, l'erreur revient. Nous avons essayé de changer l'autorité en commun, les organisations et les locataires, mais l'erreur demeure.
Notre méthode pour obtenir le jeton d'accès est la suivante:
// Gets an access token and its expiration date. First tries to get the token from the token cache.
public async Task<string> GetUserAccessTokenAsync()
{
// Initialize the cache.
HttpContextBase context = HttpContext.Current.GetOwinContext().Environment["System.Web.HttpContextBase"] as HttpContextBase;
tokenCache = new SessionTokenCache(
ClaimsPrincipal.Current.FindFirst(ClaimTypes.NameIdentifier).Value,
context);
IEnumerable<TokenCacheItem> cachedItems = tokenCache.ReadItems(appId); // see what's in the cache
if (cachedItems.Count() > 0)
return cachedItems.First().Token;
if (!redirectUri.EndsWith("/")) redirectUri = redirectUri + "/";
string[] segments = context.Request.Path.Split(new char[] { '/' });
ConfidentialClientApplication cca = new ConfidentialClientApplication(
appId,
redirectUri + segments[1],
new ClientCredential(appSecret),
tokenCache);
string allScopes = nonAdminScopes;
string[] scopes = allScopes.Split(new char[] { ' ' });
try
{
AuthenticationResult result = await cca.AcquireTokenSilentAsync(scopes);
return result.Token;
}
// Unable to retrieve the access token silently.
catch (MsalSilentTokenAcquisitionException)
{
HttpContext.Current.Request.GetOwinContext().Authentication.Challenge(
new AuthenticationProperties() { RedirectUri = redirectUri + segments[1] },
OpenIdConnectAuthenticationDefaults.AuthenticationType);
throw new ServiceException(
new Error
{
Code = GraphErrorCode.AuthenticationFailure.ToString(),
Message = Resource.Error_AuthChallengeNeeded,
});
}
}
Toutes les idées pourquoi le jeton ne peut être acquise en silence?