2017-09-14 7 views
-1
// constructor 
    public ADALTokenCache(string user) 
    { 
     // associate the cache to the current user of the web app 
     User = user; 
     this.AfterAccess = AfterAccessNotification; 
     this.BeforeAccess = BeforeAccessNotification; 
     this.BeforeWrite = BeforeWriteNotification; 

     // look up the entry in the DB 
     Cache = db.UserTokenCacheList.FirstOrDefault(c => c.webUserUniqueId == User); 
     // place the entry in memory 
     this.Deserialize((Cache == null) ? null : Cache.cacheBits); 
    } 

    // clean up the DB 
    public override void Clear() 
    { 
     base.Clear(); 
     foreach (var cacheEntry in db.UserTokenCacheList) 
      db.UserTokenCacheList.Remove(cacheEntry); 
     db.SaveChanges(); 
    } 

    // Notification raised before ADAL accesses the cache. 
    // This is your chance to update the in-memory copy from the DB, if the in-memory version is stale 
    void BeforeAccessNotification(TokenCacheNotificationArgs args) 
    { 
     if (Cache == null) 
     { 
      // first time access 
      Cache = db.UserTokenCacheList.FirstOrDefault(c => c.webUserUniqueId == User); 
     } 
     else 
     { // retrieve last write from the DB 
      var status = from e in db.UserTokenCacheList 
         where (e.webUserUniqueId == User) 
         select new 
         { 
          LastWrite = e.LastWrite 
         }; 
      // if the in-memory copy is older than the persistent copy 
      if (status.First().LastWrite > Cache.LastWrite) 
      //// read from from storage, update in-memory copy 
      { 
       Cache = db.UserTokenCacheList.FirstOrDefault(c => c.webUserUniqueId == User); 
      } 
     } 
     this.Deserialize((Cache == null) ? null : Cache.cacheBits); 
    } 

    // Notification raised after ADAL accessed the cache. 
    // If the HasStateChanged flag is set, ADAL changed the content of the cache 
    void AfterAccessNotification(TokenCacheNotificationArgs args) 
    { 
     // if state changed 
     if (this.HasStateChanged) 
     { 
      Cache = new UserTokenCache 
      { 
       webUserUniqueId = User, 
       cacheBits = this.Serialize(), 
       LastWrite = DateTime.Now 
      }; 
      //// update the DB and the lastwrite     
      db.Entry(Cache).State = Cache.UserTokenCacheId == 0 ? EntityState.Added : EntityState.Modified; 
      db.SaveChanges(); 
      this.HasStateChanged = true; 
     } 
    } 

    void BeforeWriteNotification(TokenCacheNotificationArgs args) 
    { 
     // if you want to ensure that no concurrent write take place, use this notification to place a lock on the entry 
    } 

Ceci est mon code pour gérer AdalToken Cache Je suis l'exception suivante Echec d'acquisition jeton en silence. méthode d'appel AcquireTokenImpossible d'acquérir le jeton en mode silencieux. méthode d'appel AcquireToken ne fonctionne pas

a cette exception dans le code ci-dessous près de var authResultDisc

// connexion SharePoint pour obtenir la liste des articles

DiscoveryClient discClient = new DiscoveryClient(SettingsHelper.DiscoveryServiceEndpointUri, 
async() => 
{ 
    var authResultDisc = await authContext.AcquireTokenSilentAsync(SettingsHelper.DiscoveryServiceResourceId, new ClientCredential(SettingsHelper.ClientId, SettingsHelper.AppKey), new UserIdentifier(userObjectId, UserIdentifierType.UniqueId)); 
      return authResultDisc.AccessToken; 
          }); 

          var dcr = await discClient.DiscoverCapabilityAsync("RootSite"); 

ma pensée à ce sujet est que, il dose pas de compensation les entrées de la base de données.

Quelqu'un peut m'aider à résoudre cette erreur.

+0

L'exception semble suggérer d'essayer 'AcquireToken' - que se passe-t-il lorsque vous l'utilisez? – mjwills

Répondre

0

Il s'agit d'une exception attendue si le jeton d'accès n'est pas en mesure de trouver dans le cache et d'actualiser le jeton d'accès a échoué. Veuillez vérifier si vous avez acquis le jeton d'accès avant d'appeler cette fonction.

+0

Quelle est la fonction que vous essayiez de récupérer le jeton d'accès pour SharePoint? S'il vous plaît partager le code à ce sujet et l'exception détaillée. –

+0

Une exception se produit sur la même ligne que celle où je récupère le jeton d'accès pour SharePoint. une chose que j'essayé de supprimer toutes les bases de données à partir du dossier App_Data et exécuter ma demande à nouveau, il est recommence à fonctionner sans erreur mais exception jette à nouveau après quelques jours donc mon souci est de supprimer toutes les lignes de base de données, prochain défi est comment supprimer toutes les données pour cet utilisateur? Il existe la méthode Clear() dans la classe AdalTokenCache, mais cette méthode n'a aucun appel provenant du projet entier. De nous devions appeler cette fonction pour effacer le cache de la base de données –

+0

Comme je l'ai mentionné dans la publication, l'exception est attendue lorsque la fonction 'AcquireTokenSilentAsync' ne peut pas obtenir le jeton d'accès dans le cache et le jeton d'actualisation a échoué. Et la durée de vie du jeton d'actualisation doit être de 14 jours par défaut. Vous devriez acquérir de nouveau le jeton de manière interactive lorsque vous obtenez cette exception. –