none
Problème d'identification SharePoint Online RRS feed

  • Question

  • Bonjour,

    J'utilise un environnement Sharepoint online (P2) [sous office365] dans lequel je dois accéder à une liste de contact contenant des champs personnalisés et donc non synchronisés nativement, même quand la liste est liée à Outlook (ce qui est mon cas).

    Afin de permettre leur mise à jour dans le client Outlook (2010), j'ai donc créé un add-in me permettant de créer une page de formulaire spécifique pour ces champs. Pour le code ci-dessous, il s'agit d'un simple Text Label ('Text1') et d'un bouton, qui permet d'éxécuter le code ('onClick') qui doit récupérer la valeur du champ "ID" pour des enregistrements ou il est > à 8894. Ce n'est bien sur qu'un test de connexion.

    Dans la solution Visual Studio (2010), j'ai ajouté la web référence du service listes ('FNAEMwr') et utilisé le code ci-dessous pour me connecter à la liste et vue ad-hoc.

    (code issu de la page MSDN http://msdn.microsoft.com/en-US/library/ms429658%28v=office.14%29 où vous pourrez le voir en C# aussi ;))

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    'Declare and initialize a variable for the Lists Web service. Dim listService As New FNAEMwr.Lists() 'Authenticate the current user by passing their default 'credentials to the Web service from the system credential cache. listService.Credentials = System.Net.CredentialCache.DefaultCredentials 'Set the Url property of the service for the path to a subsite. listService.Url = "https://fnaem.sharepoint.com/_vti_bin/Lists.asmx" 'Instantiate an XmlDocument object. Dim xmlDoc As New System.Xml.XmlDocument() 'Assign values to the string parameters of the GetListItems method, 'using GUIDs for the listName and viewName variables. For listName, 'using the list display name will also work, but using the list GUID 'is recommended. For viewName, only the view GUID can be used. 'Using an empty string for viewName causes the default view 'to be used. Dim listName As String = "{AXXXX41C-38A2-4B4A-A2F7-B9EDYYYYF0DC}" Dim viewName As String = "{42ZZZZ23-44D8-4492-9F56-C77WWWWDCBCA}" Dim rowLimit As String = "150" 'Use the CreateElement method of the document object to create 'elements for the parameters that use XML. Dim query As System.Xml.XmlElement = xmlDoc.CreateElement("Query") Dim viewFields As System.Xml.XmlElement = xmlDoc.CreateElement("ViewFields") Dim queryOptions As System.Xml.XmlElement = xmlDoc.CreateElement("QueryOptions") 'To specify values for the parameter elements (optional), assign CAML ' fragments to the InnerXml property of each element. query.InnerXml = "<Where><Gt><FieldRef Name=""ID"" />" + "<Value Type=""Counter"">8894</Value></Gt></Where>" viewFields.InnerXml = "<FieldRef Name=""ID"" />" queryOptions.InnerXml = "" 'Declare an XmlNode object and initialize it with the XML response 'from the GetListItems method. The last parameter specifies 'the GUID of the Web site containing the list. Setting it to 'Nothing causes the Web site specified by the Url property 'to be used. Dim nodeListItems As System.Xml.XmlNode = listService.GetListItems(listName, viewName, query, viewFields, rowLimit, queryOptions, Nothing) 'Loop through each node in the XML response and display each item. Dim listItem As System.Xml.XmlNode For Each listItem In nodeListItems Label1.Text += listItem.OuterXml Next listItem

    End Sub

    En l'état, cela ne fonctionne pas à cause d'un problème d'authentification :

    Je pense donc que la méthode pour authentifier/autoriser la connexion

    listService.Credentials = System.Net.CredentialCache.DefaultCredentials

    n'est pas la bonne; il faudrait passer les credentials du compte de messagerie utilisé pour se connecter via Outlook (?). Au pire (je sais, c'est moche) les passer "en dur" ?

    Qu'en pensez-vous ?

    Merci d'avance pour votre aide.


    P.S: ce qui est étonnant, c'est que la liste étant déjà connectée à mon outlook, les credentials devraient être là ... mais je dois rater quelque chose (et j'espère que ce n'est pas encore une limitation SP sous O365 ...).

    Edit : J'ai donc essayé la méthode "moche" en essayant de passer les credentials en "dur", sans succès, avec le code ci-dessous

    listService.Credentials = New System.Net.NetworkCredential("[user]", "[mot de passe]", "[domaine]")
    (pardon, si vous étiez en train de répondre su mon précédent envoi ... thread supprimé par erreur)

    mercredi 10 avril 2013 15:30

Toutes les réponses

  • Salut, 

    Ce n'est pas mon sujet de prédilection, mais comme personne n'a répondu, je vais essayer de donner une idée pour avancer dans ton problème. 

    Tout d'abord, le defaultCredentials ne fonctionnera pas avec SPO, parce qu'il essayera de se connecter avec ton compte local sur SharePoint Online. Ca pourrait marcher si jamais tu étais connecté en local avec un compte AD que tu utiliserais pour te connecter à ton SharePoint (On Premise du coup). 

    Quand tu te connecte sur ton SharePoint Online avec tes credentials, ton "token" est stocké dans un cookie container. 

    Du coup, ce que je pense être le plus simple pour toi, serait de récupérer ces informations en CSOM directement. 

    Si tu veux automatiser ta connexion, tu pourra toujours utiliser un outils que tu trouvera ici (spohelper). C'est un outils qui te permettra de te créer un context CSOM avec les informations stocké sur ton pc, ou en lui passant directement les login/pass (version moche :p).

    J'espère que ça taidera, et tiens nous au courant.

    Jicay

    • Proposé comme réponse JcBrabant vendredi 12 avril 2013 16:21
    vendredi 12 avril 2013 11:25
  • Merci Jicay,

    Je dois dire que la venue de SPol 2013 va énormément faciliter les choses.
    Dire que cela s'est simplifié est une gageure; c'est un autre monde !!!

    Je vous livre un petit bout de code (dans un add-in VBs Outlook - attention, placer le code dans la procédure de démarrage n'a pas de sens réel, c'est juste pour tester) pour permettre à chacun de se faire une idée, j'ai "traduit" du C# en VBscript ... j'espère que ce n'est pas trop "dirty" !
    L'exemple ci-dessous permet de se connecter à une liste (SP 2013) et récupérer la liste des champs (standards) avec leur noms internes.

    Important: pour que cela puisse fonctionner, il faut ajouter les références suivantes : System.Security et Microsoft.SharePoint.Client (pour la dernière, ce download avec d'autres dll, qui seront sans doute utile plus tard).

    Références : http://msdn.microsoft.com/fr-fr/library/fp179912.aspx - http://vrdmn.blogspot.jp/2013/01/authenticating-net-client-object-model.html (les deux en C# ... je me suis servi de cette ressource http://www.developerfusion.com/tools/convert/csharp-to-vb/ pour "traduire": I love google, sometimes !)

    Imports System.Security
    Imports SP = Microsoft.SharePoint.Client
    
    Public Class ThisAddIn
    
        Private Sub ThisAddIn_Startup() Handles Me.Startup
            Using clientContext As New SP.ClientContext("https://myCompany.sharepoint.com/sites/monSite")
    
                Dim passWord As New SecureString()
                Dim Label As String = "Champs = "
                Dim contactList As SP.List = clientContext.Web.Lists.GetByTitle("MaLISTE")
    
                For Each c As Char In "myPassword".ToCharArray()
                    passWord.AppendChar(c)
                Next
    
                clientContext.Credentials = New SP.SharePointOnlineCredentials("user@domain.onmicrosoft.com", passWord)
    
                clientContext.Load(contactList.Fields)
    
                ' We must call ExecuteQuery before enumerate contactList.Fields.
                clientContext.ExecuteQuery()
    
                For Each field As SP.Field In contactList.Fields
                    Label = Label + ", " + field.InternalName
                Next
    
                MsgBox(Label)
            End Using
    
        End Sub
    
        Private Sub ThisAddIn_Shutdown() Handles Me.Shutdown
    
        End Sub
    
    End Class





    vendredi 12 avril 2013 15:54
  • Bonjour antoine,

    Content que tu ai pu t'en sortir, désolé de ne pas avoir pu t'aider...

    manque cruellement de temps et le VB est indigeste pour moi :D

    Merci de ton retour en tout cas!

    Valentin


    Mon blog sur SharePoint
    Site du Groupe AFG
    viadeotwitter

    lundi 15 avril 2013 16:54