none
Sharepoint Online et accès via console C# RRS feed

  • Question

  • Nous avons besoin de votre aide. Nous avons des applications ASP.NET qui se connectent via CSOM à des applications Sharepoint 2010. Dans le cadre de la migration de celles-ci vers le cloud, nous souhaiterions faire la même chose.

     

    Accéder à des bases Sharepoint, à partir d’applications Web (asp.net webform) écrites en C#. Mais dans un premier temps, nous essayons avec une application console C#.

     

     

    En mettant notre user et notre mot de passe en dur dans le code, on arrive à se connecter à notre base Sharepoint :

    static void Main(string[] args)

            {

     

                var webUri = new Uri("htt ps://xxxxx.sharepoint.com/sites/xxxxx");

                const string userName = "xxxxx xxxxxx.onmicrosoft.com";

                const string password = "************";

                var securePassword = new SecureString();

                foreach (var c in password)

                {

                    securePassword.AppendChar(c);

                }

                var credentials = new SharePointOnlineCredentials(userName, securePassword);

     

                var list = GetList(webUri, credentials, "test");

                //print List title

                Console.WriteLine(list["Title"]);

                System.Diagnostics.Debug.WriteLine(list["Title"]);

            }

     

     

            public static JToken GetList(Uri webUri, ICredentials credentials, string listTitle)

            {

                using (var client = new WebClient())

                {

                    client.Headers.Add("X-FORMS_BASED_AUTH_ACCEPTED", "f");

                    client.Credentials = credentials;

                    client.Headers.Add(HttpRequestHeader.ContentType, "application/json;odata=verbose");

                    client.Headers.Add(HttpRequestHeader.Accept, "application/json;odata=verbose");

                    var endpointUri = new Uri(webUri, string.Format("/_api/web/lists/getbytitle('{0}')", listTitle));

                    var result = client.DownloadString(webUri + string.Format("/_api/web/lists/getbytitle('{0}')", listTitle));

                    var t = JToken.Parse(result);

                    return t["d"];

                }

            }

     

     

     

    Ce que l’on voudrait, c’est passer par « App Only Authentification » (ce qui évite de mettre des mots de passe en dur dans le code, et surtout stocker l’utilisateur qui fait les modifications dans les listes Sharepoint)

     

    Nous avons créé une base Sharepoint.

    On a été sur :

    htt ps://xxxxx.sharepoint.com/_layouts/15/appregnew.aspx

    pour générer un ID et un client

    On a ensuite été sur :

    htt ps://xxxxxx.sharepoint.com/_layouts/15/AppInv.aspx



    On a cherché notre ID application, et on a mis les éléments suivants :

    ID de l'application

    Titre

    Domaine d'application: localhost

    URL de redirection: htt ps://localhost

    Code XML de la demande d'autorisation: 

    <AppPermissionRequests AllowAppOnlyPolicy="true" >
        <AppPermissionRequest Scope="http://sharepoint/content/sitecollection" Right="FullControl" />
      </AppPermissionRequests>


    Et on a approuvé  (faites vous confiance...)



    Dans une application console C# :

     

    using (var clientContext = new AuthenticationManager().GetAppOnlyAuthenticatedContext("htt ps://xxxxxx.sharepoint.com/sites/StatsAndGo", "clientID", "ClientSECRET"))

                {

                    List maListe = clientContext.Web.Lists.GetByTitle("test");

                    clientContext.Load(maListe);

                    clientContext.ExecuteQuery();

                    Console.Write(maListe.ItemCount);

                }

     

    On a cette erreur sur clientcontext.executeQuery();

    Microsoft.SharePoint.Client.ServerUnauthorizedAccessException : 'Accès refusé. Vous n’êtes pas autorisé à effectuer cette action ou à accéder à cette ressource.'

     

    Les informations (clientID, clientSecret) sont bonnes, car si j’enlève le « = » à la fin du client secret :

    on a l'erreur suivante sur using (var clientContext = new AuthenticationManager().GetAppOnlyAuthenticatedContext(siteUrl, clientId, clientSecret))

    Microsoft.IdentityModel.SecurityTokenService.RequestFailedException : 'Token request failed.'

     

    Donc, nous pensons que le problème vient des droits de l’application.

     

    Pouvez vous nous aider?

     

    Merci par avance


    mercredi 5 février 2020 12:20