Le serveur distant a renvoyé une erreur: (401) non autorisé. Utilisation de CSOM dans ASP.NET
j'ai essayé de tirer quelques données de la liste SharePoint 2013 que j'ai créée et qui fonctionne très bien quand elles sont exécutées localement sur ma machine et quand elles sont exécutées localement sur le serveur. J'utilise les mêmes informations d'identification lorsque j'exécute à la fois localement et localement sur le serveur. Le problème est lorsque je publie et accédez à mon ASP.NET l'application sur le serveur j'obtiens le "Le serveur distant a retourné une erreur: (401 non autorisé." Erreur...
j'ai regardé un tas de billets sur stackoverflow et d'autres articles sur web
Ceci indique que le contexte semble utiliser IUSR: http://blogs.msdn.com/b/sridhara/archive/2014/02/06/sharepoint-2013-csom-call-from-web-part-fails-with-401-for-all-users.aspx
celui-ci mentionne d'essayer de définir les paramètres 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 le l'article ainsi que d'essayer de forcer le contexte de l'utilisation DefaultNetworkCredentials mais pas de chance. Je voudrais pour l'application pour utiliser les informations d'identification de l'utilisateur connecté et non pas 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 grandement appréciée!
Merci
4 réponses
je présume que votre ASP.NET le site web utilise L'authentification intégrée à Windows (NTLM). Un utilisateur authentifié de cette façon ne peut pas s'authentifier à un deuxième emplacement du côté du serveur (le serveur web.) Vous rencontrez ce qui est connu comme le "double saut" (1) la limitation de l'authentification NTLM. Vous devez utiliser un compte dédié côté serveur, ou si vous voulez vraiment utiliser l'identité de l'utilisateur connecté, vous devez utiliser un système d'authentification qui permet la délégation, comme Kerberos.
si vous avez vraiment besoin de l'identité de l'utilisateur pour accéder aux données SharePoint et vous ne pouvez pas changer le schéma d'authentification, alors la meilleure façon de le faire est d'utiliser le CSOM JavaScript. Cela signifie que l'utilisateur s'authentifie directement sur le serveur SharePoint (un simple saut, pas double) et votre ASP.NET le site sert la page contenant ce script à l'utilisateur.
(1) http://blogs.msdn.com/b/knowledgecast/archive/2007/01/31/the-double-hop-problem.aspx
Utiliser les informations d'Identification par Défaut fonctionné pour moi:
HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
httpWebRequest.UseDefaultCredentials = true;
configurer les crendentials par 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 modifier sans publier ou recompiler l'application.
juste pour ajouter un autre paramètre que j'ai rencontré. Si le compte est limité à uniquement l'accès à certains serveurs que d'ajouter la machine client pour 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 le 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 a été limité à certains machine. J'ai ajouté mon serveur d'application web hébergé sur le compte et cela a fonctionné.