1

Ich möchte die Web Api Arbeit über SPO bekommen. Ich habe den Beispielcode https://blogs.msmvps.com/windsor/2017/03/12/walkthrough-building-a-custom-web-api-for-use-with-sharepoint-online/ und es funktioniert gut.Sharepoint Online Web Api Bearer Fehler 401

Jetzt möchte ich eine Get-Anfrage zu SPO hinzufügen, die auch vor Ort funktioniert. Ich habe versucht, eine Datei mit clientcontext und Webclient zu lesen, was ich bevorzugen würde. Aber ich bekomme immer einen Fehler 401 "der Remote-Server zurückgegeben einen Fehler (401) nicht autorisiert"

Ich verstehe nicht den Fehler 401, weil der Beispielcode funktioniert gut. Ich sehe keine Unterschiede.

 public async Task<IEnumerable<string>> GetUserInfo(string sharePointUrl) 
    { 
     var results = new List<string>(); 

     try 
     { 
      var userToken = this.Request.Headers.Authorization.Parameter; 
      var newToken = await GetSharePointAccessToken(sharePointUrl, userToken); 

      using (var context = new ClientContext(sharePointUrl)) 
      { 
       context.ExecutingWebRequest += 
        (s, e) => e.WebRequestExecutor.WebRequest.Headers.Add(
        "Authorization", "Bearer " + newToken); 

       var web = context.Web; 
       var user = web.CurrentUser; 
       context.Load(user); 
       context.ExecuteQuery(); 

       results.Add(user.Title); 
       results.Add(user.LoginName); 
       results.Add(user.Email); 
      } 
     } 
     catch (Exception ex) 
     { 
      results.Add(ex.ToString()); 
     } 

     return results; 
    } 

Hier ist mein Code-Schnipsel:

 public async Task<IEnumerable<LessVariables>> GetLess(string url, string id) 
    { 
     [...] 

     var list = new List<LessVariables>(); 

     try 
     { 
      var userToken = this.Request.Headers.Authorization.Parameter; 
      var newToken = await GetSharePointAccessToken(url, userToken); 
      var siteUrl = url; 
      var file = siteUrl + "/Style Library/xxx/less/" + id + ".less"; 
      var files = "/Style Library/xxx/less/" + id + ".less"; 

      using (var context = new ClientContext(url)) 
      { 
       context.ExecutingWebRequest += 
        (s, e) => e.WebRequestExecutor.WebRequest.Headers.Add(
        "Authorization", "Bearer " + newToken); 
       context.AuthenticationMode = ClientAuthenticationMode.Default; 
       context.ExecuteQuery(); 
       var fileInfo = Microsoft.SharePoint.Client.File.OpenBinaryDirect(context, files); 

// After this line I get the 401 error 


       using (WebClient client = new WebClient()) 
       { 
        client.Headers[HttpRequestHeader.Authorization] = "Bearer " + newToken; 
        //client.UseDefaultCredentials = true; 
        string s = client.DownloadString(file); 

// After try to DownloadString I got the 401 error. 

        var regex = new Regex(@"(?<name>[@].*:)\s(?<value>.*)(;)"); 
        var matches = regex.Matches(s); 
        var parameters = new List<KeyValuePair<string, string>>(); 

        foreach (var match in matches.Cast<Match>()) 
        { 
         list.Add(new LessVariables 
         { 
          key = match.Groups["name"].Value, 
          value = match.Groups["value"].Value 
         }); 
        } 
       } 
      } 
      return list; 
     } 
     catch (Exception ex) 
     { [...] 

     } 
    } 
+0

den Code auf SPO Um zu testen, habe ich zu Testzwecken verwendet 'client.Credentials = new SharePointOnline Anmeldeinformationen (Benutzername, passWord); ' Der Code ist in Ordnung und alles funktioniert, aber ich möchte keine Anmeldeinformationen verwenden. Die API muss mit einem Token authentifiziert werden. –

Antwort

1

Der Grund, warum Sie dieses Verhalten auftreten, während Datei, dass die Anforderung http://<site url>//<folder name>/<file name> Ursachen umleiten aber WebClient Streifen aus Genehmigung ist das Lesen Header (wie Bearer-Token), wenn nach einer Weiterleitung. Das ähnliche Verhalten wurde in this post erläutert.

Da Sie Sharepoint Online-Targeting, können Sie einen Dateiinhalt mit einem anderen Ansatz abrufen dass verursacht keine Umleitung, zum Beispiel API mithilfe von Sharepoint REST, den folgenden File resource Endpunkt insbesondere:

Url: http://<site url>/_api/web/getfilebyserverrelativeurl('/<folder name>/<file name>')/$value 
Method: Get 

Beispiel

using (var client = new WebClient()) 
{ 
    client.Headers[HttpRequestHeader.Authorization] = "Bearer " + accessToken;  
    var content = client.DownloadString("https://contoso.sharepoint.com/_api/web/getfilebyserverrelativeurl('/Shared%20Documents/Guide.docx')/$value"); 
    //...  
} 
+1

Vielen Dank! Ich wusste nicht, dass ich eine Umleitung gemacht habe, indem ich die volle uri benutzt habe. Wenn ich Sie richtig verstehe, muss ich bei der Verwendung von SPO die SharePoint-REST-API verwenden? –

+0

Die Verwendung der REST-API ist nicht obligatorisch. Weitere APIs (CSOM, RPC) sind weiterhin verfügbar. Aber angesichts der Anforderungen zur Authentifizierung über OAuth-Bearer-Token und den erwähnten Einschränkungen halte ich den REST für eine Möglichkeit, eine Datei hier herunterzuladen –

+0

Okay, danke für deine Antwort. Last but not least - Ich führe den Befehl mit den Berechtigungen des Benutzers aus, der die Web-API aufruft (-> Name des Benutzers/Identitätswechsel?)? –

Verwandte Themen