2009-10-16 3 views
1

J'ai besoin de permettre aux utilisateurs d'ouvrir un document Word à partir d'une page Web et de le modifier localement en utilisant l'application MS Word. enfin, ils devraient pouvoir (poster) sauvegarder le document modifié sur le serveur.Est-il possible de partager des cookies de session ASP.NET entre IE et le module complémentaire

Pour l'exigence ci-dessus j'ai choisi ASP.NET, C#, .NET 3.5, IIS, IE6 (ou au-dessus) et MS Office 2007 (devrait être dans toutes les stations de travail).

J'ai développé une application web ASP.NET, qui a trois pages aspx Login.aspx, DocList.aspx et SaveDoc.aspx.

  1. Login.aspx - Authentification/Autorisation. (Type d'authentification: Formulaires)
  2. DocList.aspx - Pour afficher/télécharger des documents Word.
  3. SaveDoc.aspx - Pour enregistrer le document Word modifié dans le serveur.

Et aussi j'ai développé un complément de ruban de mot partagé, qui aide l'utilisateur à enregistrer le document modifié sur le serveur en cliquant sur le bouton "Publier" dans le complément. client Web a été utilisé pour télécharger le document modifié. Pour enregistrer le document modifié sur le serveur, ce complément doit être installé sur tous les postes de travail.

string modifiedWordXml = applicationObject.ActiveDocument.WordOpenXML; 

    WebClient client = new WebClient(); 
    string serverAddress = "http://localhost:51507/DOCMGR/SaveDoc.aspx"; 
    byte[] byteArray = Encoding.UTF8.GetBytes(modifiedWordXml); 
    byte[] responceArray = client.UploadData(serverAddress, byteArray); 
    string res = Encoding.UTF8.GetString(responceArray); 
    MessageBox.Show(res,"Document Manager"); 

page Web affiche la liste des liens vers des documents de mot, après avoir cliqué sur le lien du document Word est ouvert dans une application séparée MS Word dans le client. Là, l'utilisateur peut modifier le document et en cliquant sur "Puplish" bouton sur le ruban de complément, document modifié avec succès enregistré sur le serveur.

Ma condition est satisfaite et tout fonctionne correctement lorsque l'authentification est désactivée.

Si j'ai activé l'authentification, le complément n'a pas pu télécharger le document modifié sur le serveur car il n'est pas authentifié et n'a pas pu partager les cookies d'authentification avec l'IE.

Y a-t-il une solution de contournement/une solution pour satisfaire à mes exigences? Votre aide sera grandement appréciée.

Répondre

3

Vous pouvez PInvoke GetInternetCookie pour obtenir le cookie de session ASPNET.

 [DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)] 
    protected static extern bool InternetGetCookie(
     string url, 
     string name, 
     StringBuilder cookieData, 
     ref int length); 

Et vous pouvez construire manuellement un HttpWebRequest et ajouter un cookie de session ASPNET à un CookieContainer sur votre objet de requête. Il existe peut-être un moyen d'ajouter des cookies à la WebRequest sous-jacente créée par WebClient, si c'est le cas, vous pouvez l'utiliser à la place.

Espérons que cela aide.

EDIT:

est fondamentalement ici le code que j'utilise sur mon HttpWebRequest pour définir des cookies dans le cache des cookies IE. Malheureusement, je n'ai aucun code qui permet de lire le cookie dans le cache ici.

Fondamentalement, ce que vous voulez faire est de prendre une dérivation de ce code et créer votre objet CookieCollection avec les cookies du domaine de votre site Web en utilisant InteretGetCookie. Vous devrez les analyser manuellement. Ensuite, sur votre HttpWebRequest, vous pouvez utiliser les cookies que vous lisez depuis votre domaine en utilisant InternetGetCookie et les transmettre dans le CookieContainer que vous avez créé.

public class HttpWebConnection 
{ 
    [DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)] 
    protected static extern bool InternetSetCookie(
     string url, 
     string name, 
     string cookieData); 

    [DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)] 
    protected static extern bool InternetGetCookie(
     string url, 
     string name, 
     StringBuilder cookieData, 
     ref int length); 

    public HttpWebConnection() 
    { 
     Cookies = new CookieContainer(); 
     AutoRedirect = false; 
    } 

    public HttpWebConnection(string baseAddress) 
     : this() 
    { 
     BaseAddress = baseAddress; 
     BaseUri = new Uri(BaseAddress); 
    } 

    public bool AutoRedirect { get; set; } 

    public Uri BaseUri { get; private set; } 

    public string BaseAddress { get; private set; } 

    public CookieContainer Cookies { get; private set; } 

    public virtual HttpWebResponse Send(string method, Uri uri) 
    { 
     return Send(method, uri, null, false); 
    } 

    public virtual HttpWebResponse Send(string method, Uri uri, string post, bool authenticating) 
    { 
     Uri absoluteUri = null; 
     if (uri.IsAbsoluteUri) 
     { 
      absoluteUri = uri; 
     } 
     else 
     { 
      absoluteUri = new Uri(BaseUri, uri); 
     } 

     HttpWebRequest request = WebRequest.Create(absoluteUri) as HttpWebRequest; 
     request.CookieContainer = Cookies; 
     request.Method = method; 
     if (method == "POST") 
     { 
      request.ContentType = "application/x-www-form-urlencoded"; 
     } 

     request.AllowAutoRedirect = false; 

     if (!string.IsNullOrEmpty(post)) 
     { 
      Stream requestStream = request.GetRequestStream(); 
      byte[] buffer = Encoding.UTF8.GetBytes(post); 
      requestStream.Write(buffer, 0, buffer.Length); 
      requestStream.Close(); 
     } 

     HttpWebResponse response = null; 

     response = request.GetResponse() as HttpWebResponse; 

     foreach (Cookie cookie in response.Cookies) 
     { 
      bool result = InternetSetCookie(BaseAddress, cookie.Name, cookie.Value); 
      if (!result) 
      { 
       int errorNumber = Marshal.GetLastWin32Error(); 
      } 
     } 

     if (AutoRedirect && (response.StatusCode == HttpStatusCode.SeeOther 
        || response.StatusCode == HttpStatusCode.RedirectMethod 
        || response.StatusCode == HttpStatusCode.RedirectKeepVerb 
        || response.StatusCode == HttpStatusCode.Redirect 
        || response.StatusCode == HttpStatusCode.Moved 
        || response.StatusCode == HttpStatusCode.MovedPermanently)) 
     { 
      string uriString = response.Headers[HttpResponseHeader.Location]; 
      Uri locationUri; 
      //TODO investigate if there is a better way to detect for a relative vs. absolute uri. 
      if (uriString.StartsWith("HTTP", StringComparison.OrdinalIgnoreCase)) 
      { 
       locationUri = new Uri(uriString); 
      } 
      else 
      { 
       locationUri = new Uri(this.BaseUri, new Uri(uriString)); 
      } 

      response = Send("GET", locationUri); 
     } 

     return response; 
    } 
} 
+0

Nous vous remercions de votre aide. J'ai changé mon code pour utiliser HttpWebRequest au lieu de WebClient et ajouter un cookie de session ASPNET à un objet CookieContainer sur requête. Toujours pas de chance. Pour votre référence, je joins le code ci-dessous. S'il vous plaît laissez-moi savoir si quelque chose me manque. HttpWebRequest request = (HttpWebRequest) WebRequest.Create ("http: //SERVERIP/DOCMGR/SaveDoc.aspx"); Uri uri = new Uri ("http: // SERVERIP"); request.CookieContainer = GetUriCookieContainer (uri); request.Method = "POST"; REMARQUE: HTTP: // EST DÉTRUIT DANS CE POSTE – afin

+0

J'ai lu un article msdn indiquant que "InternetGetCookie ne renvoie pas les cookies que le serveur a marqués comme non-scriptable avec l'attribut" HttpOnly "dans l'en-tête Set-Cookie." MSDN URL: http://msdn.microsoft.com/fr-fr/library/aa384710%28VS.85%29.aspx Étant donné que nous utilisons l'authentification par formulaire et que les cookies ont l'attribut "HttpOnly" par défaut, InternetGetCookie ne renvoie pas les cookies. Y at-il une solution de contournement/solution? Merci d'avance. – afin

+0

Ceci est une question stupide mais pouvez-vous simplement créer un cookie sur votre site que vous partagez pour l'authentification lorsque l'utilisateur est authentifié qui n'est pas marqué HttpOnly? Puis, au lieu de rechercher le cookie de session .NET, vous pouvez rechercher le vôtre qui a été créé après l'authentification de l'utilisateur? –

Questions connexes