Удаленный сервер вернул ошибку: (401) Unauthorized. С помощью csom в ASP.NET

Я попытался вытащить некоторые данные списка SharePoint 2013, которые я создал, которые отлично работают при локальном запуске на моей машине и при локальном запуске сервера. Я использую те же учетные данные при запуске как локально, так и локально на сервере. Проблема в том, когда я публикую и перехожу к моему ASP.NET приложение на сервере я получаю "удаленный сервер вернул ошибку: (401) несанкционированный." Ошибка...

Я просмотрел кучу сообщений на stackoverflow и некоторые другие статьи о web

это указывает на то, что контекст, похоже, использует 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

в этом упоминается, чтобы попытаться установить сетевые учетные данные по умолчанию: https://sharepoint.stackexchange.com/questions/10364/http-401-unauthorized-using-the-managed-client-object-model

Я пробовал использовать исправления, упомянутые в статья, а также попытка заставить контекст использовать DefaultNetworkCredentials, но не повезло. Я хотел бы, чтобы приложение использовало учетные данные зарегистрированного пользователя, а не машины...

вот код, который я использую:

        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);

на сервере работает IIS 6.0

любой совет был бы очень признателен!

спасибо

4 ответов


Я предполагаю, что ваш ASP.NET веб-сайт использует проверку подлинности Windows Integrated (NTLM). Пользователь, прошедший проверку подлинности таким образом, не может пройти проверку подлинности во втором расположении со стороны сервера (веб-сервер.) Вы испытываете то, что известно как "двойной прыжок" (1) ограничение NTLM. Необходимо использовать выделенную учетную запись на стороне сервера, или, если вы действительно хотите использовать удостоверение пользователя, необходимо использовать схему проверки подлинности, разрешающую делегирование, например Kerberos.

Если вам действительно нужно удостоверение пользователя для доступа к данным SharePoint, и вы не можете изменить схему проверки подлинности, тогда лучший способ сделать это-использовать JavaScript CSOM. Это означает, что пользователь выполняет проверку подлинности непосредственно на сервере SharePoint (один прыжок, а не двойной) и ASP.NET сайт обслуживает страницу, содержащую этот скрипт, для пользователя.

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


использовать учетные данные по умолчанию для меня:

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

настройка crendentials по коду:

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

вы должны поместить это в файл конфигурации, чтобы изменить его без публикации или перекомпиляции приложения.


просто добавить еще одну настройку, с которой я столкнулся. Если учетная запись ограничена доступом только к определенным серверам, добавьте клиентскую машину в эту учетную запись. Например, если веб-приложение размещено на сервере A и пытается подключиться к SharePoint 2010 на сервере B с учетной записью ABC, убедитесь, что учетная запись имеет доступ к серверу A в Active Directory. Обычно у рекламной учетной записи нет ограничений на подключение к машинам, но в моем случае учетная запись была ограничена только некоторые машины. Я добавил в учетную запись сервер веб-приложения, и он сработал.