2015-04-29 6 views
3

У меня есть консольное приложение, в котором я обновляю свойства профиля пользователя SharePoint Online через CSOM. Когда я делаю это через следующий код ниже (используя имя пользователя и пароль), он работает отлично.SharePoint Online - обновить свойства профиля пользователя через приложение CSOM

private static void UpdateUserProfileProperties() 
{ 
    var userAccountName = "i:0#.f|membership|[email protected]"; 
    var siteUrl = "https://mySite-admin.sharepoint.com"; 
    var myUserName = "myUserName"; 
    var myPassword = "myPassword"; 
    var secureStringPassword = new SecureString(); 
    myPassword.ToList().ForEach(c => secureStringPassword.AppendChar(c)); 

    using (var context = new ClientContext(siteUrl)) 
    { 
     var credentials = new SharePointOnlineCredentials(myUserName, secureStringPassword); 
     context.Credentials = credentials; 

     var peopleManager = new PeopleManager(context); 
     var personProperties = peopleManager.GetPropertiesFor(userAccountName); 

     context.Load(personProperties, p => p.AccountName, p => p.UserProfileProperties); 
     context.ExecuteQuery(); 
    } 
} 

Теперь, я создал приложение в SharePoint (через страницу AppRegNew.aspx). Я получил разрешение приложения арендатора на уровень (через страницу AppInv.aspx) и следующее разрешение запрос XML:

<AppPermissionRequests AllowAppOnlyPolicy="true"> 
    <AppPermissionRequest Scope="http://sharepoint/content/tenant" Right="FullControl"/> 
</AppPermissionRequests> 

Теперь я использую ClientId/clientSecret для аутентификации вместо имени пользователя и пароля - с помощью этого код:

public static void UpdateUserProfileProperties2() 
{ 
    var userAccountName = "i:0#.f|membership|[email protected]"; 
    var siteUrl = "https://mySite-admin.sharepoint.com"; 
    var siteUri = new Uri(siteUrl); 
    var siteRealm = TokenHelper.GetRealmFromTargetUrl(siteUri); 
    var siteToken = TokenHelper.GetAppOnlyAccessToken(TokenHelper.SharePointPrincipal, siteUri.Authority, siteRealm).AccessToken; 

    using (var context = TokenHelper.GetClientContextWithAccessToken(siteUri.ToString(), siteToken)) 
    { 
     var peopleManager = new PeopleManager(context); 
     var personProperties = peopleManager.GetPropertiesFor(userAccountName); 

     context.Load(personProperties, p => p.AccountName, p => p.UserProfileProperties); 
     context.ExecuteQuery(); 
    } 
} 

Я могу получить токен и контекст просто отлично. Когда линия context.ExecuteQuery(); исполняет, я получаю следующее исключение:

Microsoft.SharePoint.Client.ServerUnauthorizedAccessException: отказано в доступе. У вас нет разрешения на выполнение этого действия или доступ к этому ресурсу.

Приложение clientID/clientSecret для всех видов других операций на основе сайта. Можно ли загружать пользовательские свойства в админ-сайт с помощью clientID/clientSecret? Если да, можете ли вы привести пример? Как я могу предоставить приложению соответствующие разрешения?

+0

была ли проблема приложения, не имеющего доступа к профилям пользователей через appmanifest.xml? –

+0

Какие библиотеки вы импортировали для 'PeopleManager', я получаю ошибку при использовании' PeopleManager' –

ответ

0

Если вы дали надстройку правильных разрешений:

  1. http://sharepoint/social/core
  2. http://sharepoint/social/tenant

то единственное, что может быть неправильным является разрешений пользователей. Код SharePoint выполняется с разрешениями, которые являются пересечением разрешений надстройки и текущих прав пользователя.

 Смежные вопросы

  • Нет связанных вопросов^_^