2016-08-04 3 views
1

Une application sur laquelle mon collègue et moi travaillons génère des fichiers PDF et renvoie le résultat au client. Cette application MVC est seulement ciblée pour un client spécifique.Enregistrement de documents sur OneDrive à l'aide de Microsoft Graph API et de MSAL auth

L'idée est de centraliser l'exportation des fichiers PDF vers OneDrive (pour Business), afin que le client puisse voir le document à tout moment, n'importe où, sur n'importe quel appareil.

Est-il possible d'utiliser l'API Microsoft Graph en combinaison avec l'authentification msal (point de terminaison v2.0) pour accomplir cela? Pourrait-on considérer OneDrive for Business comme une solution de "stockage centralisé" pour les petites entreprises?

Merci pour tout conseil. :)

Répondre

1

Le point de terminaison d'authentification v2 ne prend actuellement pas en charge les étendues d'application uniquement authentifiées sans interaction d'interface utilisateur. Vous pouvez obtenir le jeton d'accès et le jeton d'actualisation à l'aide de la bibliothèque MSAL (Microsoft Authentication Library) en vous connectant à Azure AD. Vous pouvez ensuite utiliser le jeton d'accès et actualiser les utilisateurs de whiteout de jeton interactifs. Les jetons de rafraîchissement sont valides pendant 14 jours et, en cas d'utilisation continue, ils peuvent durer jusqu'à 90 jours. Après 90 jours, les utilisateurs seront invités à se ré-authentifier.

Voici un échantillon de référence pour télécharger le PDF à onedrive pour bushiness:

public static void CreateItem(string accessToken) 
    { 
     string itemCreateUri = "https://graph.microsoft.com/v1.0/me/drive/root/children"; 
     string itemData = "{\"name\":\"book2.pdf\",\"file\":{}}"; 
     var itemCreatedResult = RESTRequsetHelper.RESTRequsetHelper.PostAsync(itemCreateUri, itemData, accessToken).Result; 
     DriveItem item = new DriveItem(itemCreatedResult); 

     string itemUploadUri= $"https://graph.microsoft.com/v1.0/me/drive/items/{item.Id}/content"; 

     System.IO.FileStream fs = System.IO.File.Open(@"C:\users\user1\desktop\book1.pdf",System.IO.FileMode.Open); 
     StreamContent streamContent = new StreamContent(fs); 
     var uploadResult= RESTRequsetHelper.RESTRequsetHelper.SendHttpRequest(HttpVerb.PUT, itemUploadUri, streamContent, accessToken).Result; 

     fs.Close(); 

    } 

    public static async Task<string> PostAsync(string uri, string jsonBody, string accessToken) 
    { 
     return await SendHttpRequest(HttpVerb.POST, uri, jsonBody, accessToken); 
    } 

    private static async Task<string> SendHttpRequest(HttpVerb ver, string uri, string jsonBody, string accessToken) 
    { 
     HttpClient client = new HttpClient(); 
     client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("bearer", $"{accessToken}"); 
     var stringContent = new StringContent(jsonBody,Encoding.UTF8,"application/json"); 

     if (ver == HttpVerb.POST) 
     { 
      return await client.PostAsync(uri, stringContent).ContinueWith<string>((response) => 
      { 
       return response.Result.Content.ReadAsStringAsync().Result; 
      }); 
     } 
     else 
     { 
      return await client.PutAsync(uri, stringContent).ContinueWith<string>((response) => 
      { 
       return response.Result.Content.ReadAsStringAsync().Result; 
      }); 
     } 

    } 

    public static async Task<string> SendHttpRequest(HttpVerb ver, string uri, StreamContent steamBody, string accessToken) 
    { 
     HttpClient client = new HttpClient(); 
     client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("bearer", $"{accessToken}"); 

     if (ver == HttpVerb.POST) 
     { 
      return await client.PostAsync(uri, steamBody).ContinueWith<string>((response) => 
      { 
       return response.Result.Content.ReadAsStringAsync().Result; 
      }); 
     } 
     else 
     { 
      return await client.PutAsync(uri, steamBody).ContinueWith<string>((response) => 
      { 
       return response.Result.Content.ReadAsStringAsync().Result; 
      }); 
     } 

    } 
} 
+0

Merci. Vraiment besoin d'avoir des étendues d'application seulement qui authentifié sans interaction UI. espérons que l'équipe peut apporter cette fonctionnalité – Jens

1

Je suppose que vous utilisez une variante d'une application C# (ASP.NET, UWP, Xamarin). Dans tous ces cas, ce que vous essayez de faire est certainement possible.

Le UWP Snippets sample et le Xamarin Snippets sample démontrent l'authentification à l'aide de MSAL combinée avec divers appels Microsoft Graph en utilisant la bibliothèque Microsoft Graph Client pour .NET. Les deux ont également des exemples de téléchargement, de téléchargement, de mise à jour et d'autres opérations sur OneDrive.

Si vous utilisez une autre plate-forme/langue autre que .NET, MSAL ne s'appliquera pas, mais many other samples sur Github pour vous permettre de vérifier. Plusieurs d'entre eux démontrent l'utilisation du point de terminaison d'authentification v2.0.

+0

Merci pour la réponse rapide Robert. Les documents PDF sont générés dans la partie Web API C# et doivent être téléchargés dans OneDrive à l'aide de l'API MSAL & Graph. (Je suppose sur les articles que ces technologies sont le meilleur choix en ce moment.) Ces actions devraient se produire sans interaction UI. Cordialement, Jens – Jens

+0

MSAL devra exécuter le flux de l'interface utilisateur d'authentification et accorder des autorisations à votre application via un utilisateur. En supposant que vous conserviez le jeton d'actualisation que vous récupérez, vous pouvez continuer à actualiser votre jeton d'accès pendant un certain temps. Les appels au graphique ne nécessitent aucune interaction de l'utilisateur une fois que vous avez un jeton d'accès. Il existe des moyens d'utiliser [flux d'informations d'identification client] (https://azure.microsoft.com/fr-fr/documentation/articles/active-directory-protocols-oauth-service-to-service/) pour authentifier le graphique d'un démon/service sans flux utilisateur. Vous voudrez peut-être regarder cela aussi. –