2017-10-18 10 views
1

Nous avons rencontré le problème suivant: Nous avons implémenté l'API Web Azure AD Authenticated et nous avons réussi à passer des appels avec ADAL 1.0.12 (nous avions notre propre wrapper autour pour le traitement iframe pour la connexion silencieuse).ADAL.js L'opération de renouvellement de jeton a échoué en raison du délai d'attente Azure AD Auth Web API

Maintenant, nous nous sommes débarrassés de tout notre wrapper et mis à jour vers la dernière version et avons commencé à obtenir le problème décrit ici: l'opération de renouvellement de jetons a expiré. L'architecture Azure AD derrière l'API est très simple: une application Web enregistrée avec Lire les données du répertoire et Se connecter et lire les autorisations du profil utilisateur. Nous avons une autre application native enregistrée avec des autorisations pour l'application Web (accès au nom de l'application Web ICI). Oauth2AllowImplicitFlow est défini sur true pour les deux applications dans leurs manifestes.

Les deux applications ont enregistré un URI de redirection générique pour https://ourtenant.sharepoint.com/ * (nous effectuons les appels de SharePoint vers l'API Web). En outre, l'application cliente native a enregistré l'URL de redirection vers l'URI unique (URI de l'application ID) de l'application API Web.

Les deux applications ont été autorisées admin avant - ils travaillaient très bien avec l'ancienne version de ADAL.js

Alors, est un code ici. Notez que nous avons essayé les deux sans callback callCall (avec actualisation de la page directement sur la page en cours) et avec l'actualisation de la page (vérifiez le code commenté dans la méthode initLogin). Nous avons également eu un commutateur pour générer un popup ou un iframe avec un rappel sur la connexion réussie.

Le problème est avec authContext.acquireToken. Notez que si nous appelons OurNamespace.authContext.getCachedToken (OurNamespace.clientId), nous obtenons un jeton stocké pour la ressource. Notez également que nous appelons correctement handleWindowCallback après chaque rafraîchissement/iframe/popup de la page.

Se produit quel que soit le navigateur.

OurNamespace = { 

serviceMainUrl: "https://localhost:44339", 
webApiAppIdUri: "WEB-API-URI", 
tenant: "TENANT", 
clientId: "NATIVE-APP-GUID", // Native APP 
adalEndPoints: { 
    get: null 
}, 
adal: null, 
authContext: null, 
dummyAuthPage: null, 
usePopup: true, 

init: function() { 
    this.dummyAuthPage = "DummmyLogin.aspx"; 
    OurNamespace.adalEndPoints.get = OurNamespace.serviceMainUrl + "/api/values"; 
    OurNamespace.authContext = new AuthenticationContext({ 
     tenant: OurNamespace.tenant + '.onmicrosoft.com', 
     clientId: OurNamespace.clientId, 
     webApiAppIdUri: OurNamespace.webApiAppIdUri, 
     endpoints: OurNamespace.adalEndPoints, 
     popUp: false, 
     postLogoutRedirectUri: window.location.origin, 
     cacheLocation: "localStorage", 
     displayCall: OurNamespace.displayCall, 
     redirectUri: _spPageContextInfo.siteAbsoluteUrl + "/Pages/" + OurNamespace.dummyAuthPage 
    }); 
    var user = OurNamespace.authContext.getCachedUser(); // OurNamespace.authContext.getCachedToken(OurNamespace.clientId) 
    if (user) { 
     OurNamespace.azureAdAcquireToken(); 
    } else { 
     OurNamespace.initLogin(); 
    } 
}, 

initLogin: function() { 
    //OurNamespace.authContext.config.displayCall = null; 
    //var isCallback = OurNamespace.authContext.isCallback(window.location.hash); 
    //OurNamespace.authContext.handleWindowCallback(); 

    //if (isCallback && !OurNamespace.authContext.getLoginError()) { 
    // window.location.href = OurNamespace.authContext._getItem(OurNamespace.authContext.CONSTANTS.STORAGE.LOGIN_REQUEST); 
    //} 

    OurNamespace.authContext.login(); 
}, 

displayCall: function (url) { 
    var iframeId = "azure-ad-tenant-login", 
     popup = null; 
    if (OurNamespace.usePopup) { 
     popup = window.open(url, 'auth-popup', 'width=800,height=500'); 
    } else { 
     var iframe = document.getElementById(iframeId); 
     if (!iframe) { 
      iframe = document.createElement("iframe"); 
      iframe.setAttribute('id', iframeId); 
      document.body.appendChild(iframe); 
     } 
     iframe.style.visibility = 'hidden'; 
     iframe.style.position = 'absolute'; 
     iframe.src = url; 
     popup = iframe.contentDocument; 
    } 
    var intervalId = window.setInterval(function() { 
     try { 
      // refresh the contnetDocument for iframe 
      if (!OurNamespace.usePopup) 
       popup = iframe.contentDocument; 
      var isCallback = OurNamespace.authContext.isCallback(popup.location.hash); 
      OurNamespace.authContext.handleWindowCallback(popup.location.hash); 
      if (isCallback && !OurNamespace.authContext.getLoginError()) { 
       popup.location.href = OurNamespace.authContext._getItem(OurNamespace.authContext.CONSTANTS.STORAGE.LOGIN_REQUEST); 
       window.clearInterval(intervalId); 
       if (OurNamespace.usePopup) { 
        popup.close(); 
       } 
       var user = OurNamespace.authContext.getCachedUser(); 
       if (user) { 
        console.log(user); 
       } else { 
        console.error(OurNamespace.authContext.getLoginError()); 
       } 
      } 
     } catch (e) { } 
    }, 400); 
}, 

azureAdAcquireToken: function() { 
    OurNamespace.authContext.acquireToken(OurNamespace.adalEndPoints.get, function (error, token) { 
     if (error || !token) { 
      SP.UI.Status.addStatus("ERROR", ('acquireToken error occured: ' + error), true); 
      return; 
     } else { 
      OurNamespace.processWebApiRequest(token); 
     } 
    }); 
}, 

processWebApiRequest: function (token) { 
    // Alternatively, in MVC you can retrieve the logged in user in the web api with HttpContext.Current.User.Identity.Name 
    $.ajax({ 
     type: "GET", 
     url: OurNamespace.adalEndPoints.get, 
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 
     data: {}, 
     headers: { 
      'Authorization': 'Bearer ' + token 
     }, 
     success: function (results) { 
      var dataObject = JSON.parse(results); 
      SP.UI.Status.addStatus("Info", "ADAL GET data success: " + dataObject.webApiUser); 
      $(".grid-info").html("<h1 class=\"h1\">Current Web API authenticated user: " + dataObject.webApiUser + "</h1>"); 
     }, 
     error: function (xhr, errorThrown, textStatus) { 
      console.error(xhr); 
      SP.UI.Status.addStatus("ERROR", ('Service error occured: ' + textStatus), true); 
     } 
    }); 
} 
} 

Répondre

0

Je teste en utilisant les 1.0.15 adal.js et obtenir avec succès jeton d'accès en utilisant le authContext.acquireToken qui appellent en fait le this._renewToken(resource, callback) d'acquérir le jeton d'accès par la peau iframe. Voici l'exemple de code de test complet pour votre référence:

<html> 
 
<head> 
 

 
<script src="/js/1.0.15/adal.js"></script> 
 
<script> 
 

 
var config = { 
 
    tenant: 'adfei.onmicrosoft.com', 
 
    clientId: '7e3b0f81-cf5c-4346-b3df-82638848104f', 
 
    redirectUri: 'http://localhost/spa.html', 
 
    navigateToLoginRequestUrl:false, 
 

 
}; 
 

 
var authContext=new AuthenticationContext(config); 
 

 
var hash = window.location.hash; 
 

 
if(hash.length!=0){ 
 
    authContext.handleWindowCallback(hash); 
 
    var user=authContext.getCachedUser(); 
 
} 
 
    
 

 
function login(){ 
 
    authContext.login(); 
 
} 
 

 
function acqureToken(){ 
 
    authContext.acquireToken("https://graph.microsoft.com", function(error, token, message){ 
 
     console.log(token) 
 

 
    }) 
 
} 
 

 
</script> 
 
</head> 
 

 
<body> 
 
<button onclick="login()">Login</button> 
 
<button onclick="acqureToken()">AcquireToken</button> 
 

 
</body> 
 
</html>

est-il utile? Ou pourriez-vous partager un exemple de code exécutable pour ce problème?

0

Je ne sais pas si la version de adal.js que vous utilisez. Mais il existe un paramètre loadFrameTimeout pour l'objet de configuration que vous pouvez définir en millisecondes. Vérifiez le haut de votre fichier adal.js et il devrait être là.