Iframe dans Chrome erreur: impossible de lire "localStorage" de "Fenêtre": Accès refusé pour ce document

J'ai une application web qui utilise le localStorage. Maintenant, nous voulons intégrer cette application sur d'autres (tiers) des sites via iframe. Nous voulons offrir un iframe intégrer similaire à youtube, de sorte que d'autres sites peuvent intégrer notre application web dans une iframe. Fonctionnellement c'est le même que si il ne serait pas intégré. Mais il ne fonctionne pas. Chrome affiche le message d'erreur:

Uncaught SecurityError: Failed to read the 'localStorage' property from 'Window': Access is denied for this document.

Je viens de faire la vérification suivante (dans l'iframe):

if (typeof window.localStorage !== 'undefined') {
    //SETUP SESSION, AUHT, LOCALE, SETTINGS ETC
} else {
    //PROVIDE FEEDBACK TO THE USER
}

J'ai vérifié mes paramètres de sécurité dans Chrome comme décrit dans un autre Stackoverflow Fil mais ça ne fonctionne pas. Est-il un changement pour faciliter l'incorporation possible sans la nécessité de l'ajustement (par défaut) les paramètres de sécurité de la plupart des navigateurs modernes?

De donner plus d'informations, nous utilisons de Braise-CLI pour notre web app et allumé CSP (plus d'infos sur la Braise-CLI CSP). Pourrait CSP cause de notre application web pour lancer des erreurs de sécurité?

  • votre titre fait référence à une iframe? est quelque chose dans l'iframe de la tentative d'accès au local de stockage? qui sonne comme il pourrait déclencher une alerte de sécurité?
  • J'ai reformulé ma question de départ. Nous voulons simplement nous fournir d'autres sites web la possibilité d'intégrer notre application web via iframe. Ainsi, le window.localStorage appel est dans notre code d'application web et, par conséquent, dans le iframe. Nous ne voulons pas faire toute fantaisie croix domaine de chose. Juste faire de notre application web disponible via iframe. Espérons que cela clarifie le problème.
  • si l'application web utilise le stockage local, puis en l'exécutant dans un iframe, va provoquer un cross-domain problème, parce que la Fenêtre est mondial... ce sera à essayer d'accéder aux locaux du client de la fenêtre.localstorage.. rappelez-vous locastorage est un navigateur client chose.. pas hébergé/server chose.. votre application n'a pas de savoir si il est servi à partir de n'importe où
  • Donc, il n'y a aucune chance pour qu'il fonctionne? Nous n'avons pas notre conception d'une application pour cela, mais de nombreux clients demandé cette fonctionnalité, donc nous avons besoin d'une solution. Je sais que localStorage est pas un serveur de chose. Mais je pensais que les entrées sont enregistrées par domaine. Je ne veux pas mettre quoi que ce soit pour un autre domaine, pour le domaine qui est spécifié dans l'attribut src de l'iframe. Est-il un moyen de contourner la fenêtre et il suffit d'écrire à notre "domaine" d'entrée de la localStorage?
  • pas avec localStorage. si vous voulez seulement de stocker des choses sur votre domaine, vous aurez besoin d'un back-end pour conserver des données à... en utilisant ember-data ou tel.
  • Peut-être utiliser un localstorage polyfill. Pourrait aider. code.google.com/p/chromium/issues/detail?id=357625
  • un pollyfill pourrait fonctionner si le problème réside uniquement dans le fait que le client n'a pas de localstorage capacité.. toutefois, le résultat final serait encore que les clients serait de stocker des données sur leurs propres navigateurs... qui devient un problème que si les données sont nécessaires pour faire des allers et retours dans l'iframe
  • Peut-être un polyfill est une bonne solution. Concernant notre utilisation de localStorage: nous ne stockons pas les données que nous voulons persistent à notre back-end là. Nous venons d'enregistrer les paramètres comme paramètres régionaux actuel, réel jeton d'accès etc. Si l'utilisateur efface le localStorage c'est tout à fait bien, elle/il a juste besoin de définir les paramètres régionaux de nouveau et de vous connecter à nouveau. On utilise braise-simple-auth qui s'appuie sur localStorage. J'espère que c'est pas trop douloureux pour intégrer un polyfill ou quelque chose de similaire...
  • pourtant, les données sont stockées localement ne sera pas disponible pour l'application hébergée dans le iframe.. qui est pourquoi vous obtenez l'origine des erreurs vous posé.. de ne pas être capable de lire les propriétés dans le local de stockage
  • d'accord je vois. Ainsi, un utilisateur ne peut pas se connecter à notre application, s'il est hébergé dans un iframe, parce que je ne peux pas écrire les identifiants de connexion pour le localStorage. Hm... c'est pas bien. Une idée de comment résoudre ce problème? Est le polyfill la seule option viable?
  • la seule chose que je peux suggérer, c'est de regarder dans CSP: content-security-policy.com il devrait y avoir un moyen de singe avec elle pour permettre à la croix-origine cmmunication sur iframes.. (voir: bac à sable).. mais l'avertissement est qu'il est risqué et pourrait ouvrir des failles...
  • aussi.. vous pourriez envisager de stocker les informations de session dans un contrôleur ou d'un service à la place de locaux de stockage... seulement utiliser le stockage local comme si l'utilisateur clique sur actualiser.
  • Je n'ai pas eu le temps d'étudier cette question de plus. J'ai juste essayé de nouveau et de ne pas intégrer l'iframe dans un fichier html qui est de servir de système de fichiers. Au lieu de cela, j'ai utilisé un fichier servi à partir d'un serveur web. Comme par magie tout fonctionne maintenant (testé dans Chrome, Firefox, IE11 et Safari). Peut-être que je l'ai expliqué ma question n'est pas dans le droit chemin, mais il semble fonctionner comme prévu quand j'ai d'abord essayé.

InformationsquelleAutor tschoartschi | 2015-05-27