У меня есть консольное приложение, в котором я обновляю свойства профиля пользователя 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? Если да, можете ли вы привести пример? Как я могу предоставить приложению соответствующие разрешения?
была ли проблема приложения, не имеющего доступа к профилям пользователей через appmanifest.xml? –
Какие библиотеки вы импортировали для 'PeopleManager', я получаю ошибку при использовании' PeopleManager' –