2016-04-03 9 views
1

Ich weiß, dass dies schon einige Male gefragt wurde, aber ich konnte noch keine funktionierende Lösung für mein Problem finden.So laden Sie eine Datei von Sharepoint Online mit einem Zugriffstoken

Problem:

Ich brauche eine Datei von einer Sharepoint Online-Website herunterladen eine C# app CSOM und JWT Token. Wenn ich zu dem Punkt komme, wo ich diese Methode

File.OpenBinaryDirect(ClientContext context, string serverRelativeUrl); 

aufrufen bekomme ich einen 401 nicht autorisierten Fehler.

Ich authentifiziere meine Anwendung in Azure AD mit einem Zertifikat. Es funktioniert gut für den Zugriff auf SharePoint-Listen, Listenelemente und so weiter, was bedeutet, dass das Herunterladen von Dateien der einzige Teil ist, wo ich diese Fehlermeldung erhalte.

Was ich getan

Ich habe in der Sache etwas Forschung getan und fand einen Thread auf MSDN von 2 Jahren (https://social.msdn.microsoft.com/Forums/office/en-US/7746d857-d351-49cc-b2f0-496663239e02/how-to-download-a-file-version-from-office-365-using-csom?forum=sharepointdevelopment) zu erwähnen, dass es unmöglich war, Dateien von SP zum Download Zugriffstoken mit .

Dies ist ein alter Thread, also muss sich seitdem etwas geändert haben, aber bis jetzt konnte ich keine funktionierende Lösung finden.

Alle Artikel, auf die ich im Internet stoße, erwähnen die Bereitstellung von Benutzerdaten für den Kontext. Aber mein Kunde besteht darauf, Zertifikate zu verwenden. Aus diesem Grunde kann ich nicht diesen Ansatz

Frage

Gibt es eine Möglichkeit, Dateien von Sharepoint Online mit einem JWT Token herunterladen kann?

Antwort

1

Während ich nach einer Lösung suchte, stolperte ich über einen MSDN-Artikel, der die Sharepoint Online-REST-API beschreibt, und es gab einen Datei-Endpunkt, und ich beschloss, es zu versuchen. Hier ist das, was ich bin gekommen, sich mit:

public byte[] GetFileContent(File file) 
{ 
    var request = System.Net.HttpWebRequest 
     .Create($"{_serviceDefinition.ServiceId}/_api/Web/getfilebyserverrelativeurl('{file.ServerRelativeUrl}')/$value"); 

    request.Headers.Add(System.Net.HttpRequestHeader.Authorization, $"Bearer {GetAccessToken()}"); 

    byte[] fileData = new byte[0]; 

    using (var sr = request.GetResponse().GetResponseStream()) 
    { 
     using (var ms = new System.IO.MemoryStream()) 
     { 
      byte[] buffer = new byte[0x1000]; 
      int bytes; 
      while ((bytes = sr.Read(buffer, 0, buffer.Length)) > 0) 
      { 
       ms.Write(buffer, 0, bytes); 
      } 

      fileData = ms.ToArray(); 
     } 
    } 

    return fileData; 
} 

Lange Geschichte kurz Ich schaffe eine HttpWebRequest auf die folgende URL: https: // {address.of.your.sharepoint.site}/_api/Web/getfilebyserverrelativeurl ('{file.ServerRelativeUrl}')/$ value, füge mein Bearer-Token zur Anfrage hinzu und lese dann die Antwort in ein Byte-Array zur weiteren Verarbeitung.

Funktioniert wie ein Charme, aber bricht das Konzept der CSOM ein bisschen.