2009-09-30 7 views
4

J'ai construit un exécutable qui lance une boîte de dialogue dans laquelle est incorporé le contrôle IE-navigateur web IE (C++).redéfinition de GetSecurityId dans IInternetSecurityManager

Je souhaite que ce contrôle autorise les scripts inter-sites. Une image de la page Web charge le code html local, l'autre charge à partir d'un serveur. Je veux ensuite que la page du serveur appelle une fonction javascript qui se trouve dans le fichier html local. J'essaie d'y parvenir en faisant en sorte que le contrôle implémente sa propre interface "IInternetSecurityManager" dans laquelle je fournis mes propres méthodes ProcessUrlAction et GetSecurityId. D'après ce que j'ai lu, je dois faire en sorte que GetSecurityId renvoie le même domaine pour toutes les URL. Mes implémentations personnalisées sont appelées, mais peu importe ce que je fais, je reçois l'erreur "Autorisation refusée" lorsque le serveur html essaie d'accéder au script sur le fichier html local. Voici mes implémentations. Est-ce que quelqu'un voit quelque chose de mal?

#define SECURITY_DOMAIN "http:www.mysite.com" 


    STDMETHOD (GetSecurityId)(  
     LPCWSTR pwszUrl, 
     BYTE *pbSecurityId, 
     DWORD *pcbSecurityId, 
     DWORD_PTR dwReserved) 
    { 
     if (*pcbSecurityId >=512) 
     { 
      memset(pbSecurityId,0,*pcbSecurityId); 
      strcpy((char*)pbSecurityId,SECURITY_DOMAIN); 
      pbSecurityId[strlen(SECURITY_DOMAIN)] = 3; 
      pbSecurityId[strlen(SECURITY_DOMAIN)+1] = 0; 
      pbSecurityId[strlen(SECURITY_DOMAIN)+2] = 0; 
      pbSecurityId[strlen(SECURITY_DOMAIN)+3] = 0; 

      *pcbSecurityId = (DWORD)strlen(SECURITY_DOMAIN)+4; 
      return S_OK; 


     } 
     return INET_E_DEFAULT_ACTION; 
    } 

STDMETHOD(ProcessUrlAction)(
     /* [in] */ LPCWSTR pwszUrl, 
     /* [in] */ DWORD dwAction, 
     /* [size_is][out] */ BYTE __RPC_FAR *pPolicy, 
     /* [in] */ DWORD cbPolicy, 
     /* [in] */ BYTE __RPC_FAR *pContext, 
     /* [in] */ DWORD cbContext, 
     /* [in] */ DWORD dwFlags, 
     /* [in] */ DWORD dwReserved) 
    { 

     DWORD dwPolicy=URLPOLICY_ALLOW; 
     if (cbPolicy >= sizeof (DWORD)) 
     { 
      *(DWORD*) pPolicy = dwPolicy; 
      return S_OK; 
     } 

     return INET_E_DEFAULT_ACTION; 
    } 

Répondre

3

En déléguant ces fonctions au gestionnaire de la sécurité normale et avoir un regard sur les structures du gestionnaire de sécurité normale Remplit, j'ai pu déterminer que ma question était GetSecurityId. Pour mes besoins, je voulais définir le domaine de sécurité comme un fichier local pour tous les arrivants.

#define SECURITY_DOMAIN "file:" 

if (*pcbSecurityId >=512) 
{ 
    memset(pbSecurityId,0,*pcbSecurityId); 
    strcpy((char*)pbSecurityId,SECURITY_DOMAIN); 
    pbSecurityId[strlen(SECURITY_DOMAIN)+1] = 0; 
    pbSecurityId[strlen(SECURITY_DOMAIN)+2] = 0; 
    pbSecurityId[strlen(SECURITY_DOMAIN)+3] = 0; 
    pbSecurityId[strlen(SECURITY_DOMAIN)+4] = 0; 

    *pcbSecurityId = (DWORD)strlen(SECURITY_DOMAIN)+4; 
} 
+0

merci pour votre aide et de poster votre réponse. Bien que j'aie utilisé C#, tu m'as aidé à comprendre ce qui n'allait pas chez moi et où regarder! –

Questions connexes