ServerUnauthorizedAccessException при попытке подключения к Project Server через CSOM

У меня есть onPremise ферма Microsoft SharePoint 2013 с установленным Microsoft Project Server 2013.

Я пытаюсь создать веб-часть, которая должна подключаться к серверу проекта через CSOM из TeamSite для получения информации о проекте.

Это мой супер простой код:

string pwaPath = "http://sp2013/PWA";
ProjectContext projContext;

projContext = new ProjectContext(pwaPath);

projContext.Load(projContext.Projects);
projContext.ExecuteQuery();

При попытке выполнить его я получаю следующую ошибку:

ServerUnauthorizedAccessException

когда я добавляю

projContext.Credentials = new NetworkCredential("administrator", "pass", "domain");

Оно работает! Но как я могу сделать код, используя вошедшего в систему пользователя, потому что учетные данные, переданные выше, являются учетными данными пользователей, которые в данный момент вошли в систему.


person STORM    schedule 13.06.2016    source источник
comment
Проблема заключается в том, как вы создаете ProjectContext. Я не очень хорошо знаком с Project Server, а значит и с ProjectContext. Однако в приложениях SharePoint, когда вы хотите создать ClientContext, который олицетворяет текущего пользователя, вы делаете что-то вроде var clientContext = TokenHelper.GetS2SClientContextWithWindowsIdentity(hostUri, HttpContext.Current.Request.LogonUserIdentity);   -  person hyankov    schedule 13.06.2016
comment
Привет, Христо, я пытаюсь создать ферму, поэтому у меня нет класса TokenHelper. Разве это не возможно в рамках фермы?   -  person STORM    schedule 13.06.2016
comment
Привет. Не уверен в этом. Но подумайте о следующем: можете ли вы изменить код своей веб-части, чтобы использовать JSOM вместо CSOM? Таким образом, он будет выполняться в браузере с текущими учетными данными пользователя. В противном случае вам придется смотреть на олицетворение пользователя, и, по моему опыту, это никогда не бывает так просто, как вам хотелось бы.   -  person hyankov    schedule 13.06.2016
comment
@HristoYankov предоставленный вами код используется для создания ClientContext с идентификатором приложения. Не каждый код CSOM должен быть приложением.   -  person dstarkowski    schedule 14.06.2016
comment
Если у вас есть SharePoint Server и Project Server, установленные на одной машине, и вы создаете свою веб-часть на стороне сервера, почему вы хотите использовать клиентскую объектную модель? Я думаю, что объектная модель на стороне сервера (не очень хорошо документированная, потому что MS продвигает API-интерфейсы на стороне клиента из-за SharePoint / Project Online) — лучший способ для таких случаев. См. класс PSContext и его свойства (такие как Projects, EnterpriseResources и т. д.), реализованные в сборке Microsoft.ProjectServer.dll.   -  person pholpar    schedule 29.08.2016


Ответы (1)


Ваш код не будет работать, поскольку решение фермы не выполняется в контексте пользователя SharePoint. Если вы отметите System.Security.Principal.WindowsIdentity.GetCurrent()< /a> вы увидите, что текущая идентификация является встроенной в IIS IUSR. Это идентификатор, который ClientContext будет использовать для отправки запроса.

Если вы повышаете разрешения с помощью SPSecurity.RunWithElevatedPrivileges() код будет выполняться с идентификатором пула приложений. В некоторых сценариях этого может быть достаточно, но это может быть и небезопасно, так как все пользователи смогут получить доступ к ресурсам.

person dstarkowski    schedule 14.06.2016