web-dev-qa-db-fra.com

Le serveur distant a renvoyé une erreur: (401) non autorisé. Utilisation de CSOM dans ASP.NET

J'ai essayé d'extraire certaines données de la liste SharePoint 2013 que j'ai créées et qui fonctionnent correctement pour une exécution locale sur ma machine et une exécution locale sur le serveur. Je suis utilisateur avec les mêmes informations d'identification lors de l'exécution locale et locale sur le serveur. Le problème est que lorsque je publie et que je navigue vers mon application ASP.NET sur le serveur, le message "Le serveur distant a renvoyé une erreur: (401) non autorisée." Erreur...

J'ai consulté plusieurs articles sur stackoverflow et d'autres articles sur le Web.

Cela indique que le contexte semble utiliser IUSR: http://blogs.msdn.com/b/sridhara/archive/2014/02/06/sharepoint-2013-csom-call-fr-fr-web -part-fail-with-401-for-all-users.aspx

Celui-ci mentionne pour essayer de définir les informations d'identification réseau par défaut: https://sharepoint.stackexchange.com/questions/10364/http-401-unauthorized-using-the-managed-client-object-model

J'ai essayé d'utiliser les correctifs mentionnés dans l'article et de forcer le contexte à utiliser DefaultNetworkCredentials, mais sans succès. J'aimerais que l'application utilise les informations d'identification de l'utilisateur connecté et non de la machine ...

Voici le code que j'utilise:

        SP.ClientContext context = new SP.ClientContext("MySPDevInstance");
        context.Credentials = CredentialCache.DefaultNetworkCredentials;

        Entity entity = context.Web.GetEntity(collectionNamespace, collectionName);
        LobSystem lobSystem = entity.GetLobSystem();
        LobSystemInstanceCollection lobSystemInstanceCollection = lobSystem.GetLobSystemInstances();

        context.Load(lobSystemInstanceCollection);
        context.ExecuteQuery();

        LobSystemInstance lobSystemInstance = lobSystemInstanceCollection[0];
        FilterCollection filterCollection = entity.GetFilters(filter);

        filterCollection.SetFilterValue("LimitFilter", 0, 1000);

        EntityInstanceCollection items = entity.FindFiltered(filterCollection, filter, lobSystemInstance);

Le serveur exécute IIS 6.0

Tout conseil serait très apprécié!

Je vous remercie

8
Hidan

Je suppose que votre site Web ASP.NET utilise l'authentification Windows intégrée (NTLM). Un utilisateur authentifié de cette manière ne peut pas s'authentifier sur un deuxième emplacement du côté serveur (le serveur Web). Vous rencontrez ce que l'on appelle la limitation "à double saut" (1) de NTLM. Vous devez utiliser un compte dédié côté serveur ou, si vous souhaitez réellement utiliser l'identité de l'utilisateur connecté, vous devez utiliser un schéma d'authentification permettant la délégation, tel que Kerberos.

Si vous avez réellement besoin de l'identité de l'utilisateur pour accéder aux données SharePoint et que vous ne pouvez pas modifier le schéma d'authentification, le meilleur moyen de le faire est d'utiliser le JavaScript CSOM. Cela signifie que l'utilisateur s'authentifie directement sur le serveur SharePoint (un seul saut, pas le double) et que votre site ASP.NET envoie la page contenant ce script à l'utilisateur. 

(1) http://blogs.msdn.com/b/knowledgecast/archive/2007/01/31/the-double-hop-problem.aspx

5
x0n

Utiliser les informations d'identification par défaut a fonctionné pour moi:

HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
httpWebRequest.UseDefaultCredentials = true;
4
Ricardo Rix

Configurez les informations d'identification par le code:

SP.ClientContext context = new SP.ClientContext("MySPDevInstance");
context.Credentials = new NetworkCredential("username", "password");

Vous devriez mettre ceci dans le fichier de configuration pour le changer sans publier ni recompiler l'application.

4
Fals

Juste pour ajouter un paramètre supplémentaire que j'ai rencontré. Si le compte est limité à l'accès à certains serveurs uniquement, ajoutez également l'ordinateur client à ce compte. Par exemple, si une application Web est hébergée sur le serveur A et tente de se connecter à SharePoint 2010 sur le serveur B avec le compte ABC, assurez-vous que ce compte a accès au serveur A dans Active Directory. Normalement, le compte AD n'a pas de restrictions pour se connecter à des machines, mais dans mon cas, le compte était limité à certaines machines. J'ai ajouté mon serveur hébergé d'application Web au compte et cela a fonctionné.

0
Ahmad Zia