2017-05-10 1 views
0

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?

Répondre

1

Comment gérez-vous l'exception levée? Dans l'exemple fourni, ils gèrent l'erreur avec un try/catch et si l'exception est levée et que le message d'erreur correspond, ils renvoient un résultat vide. Cette requête sera ensuite interceptée par le middleware OpenId (car ..GetOwinContext(). Authentication.Challenge() définit le code de réponse sur 401 et le type d'authentification sur OpenIdConnectAuthenticationDefaults.AuthenticationType).

 try 
     { 

      // Initialize the GraphServiceClient. 
      GraphServiceClient graphClient = SDKHelper.GetAuthenticatedClient(); 

      // Get the files and folders in the current user's drive. 
      results.Items = await filesService.GetMyFilesAndFolders(graphClient); 
     } 
     catch (ServiceException se) 
     { 
      if (se.Error.Message == Resource.Error_AuthChallengeNeeded) return new EmptyResult(); 
      return RedirectToAction("Index", "Error", new { message = string.Format(Resource.Error_Message, Request.RawUrl, se.Error.Code, se.Error.Message) }); 
     }