我有一个控制台应用程序,我通过CSOM更新SharePoint Online用户配置文件属性。当我通过下面的代码(使用用户名和密码)执行此操作时,它可以正常工作。
private static void UpdateUserProfileProperties()
{
var userAccountName = "i:0#.f|membership|myAccounName@mySite.com";
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|myAccounName@mySite.com";
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:拒绝访问。您无权执行此操作或访问此资源。
app clientID / clientSecret适用于各种其他基于站点的操作。是否可以通过clientID / clientSecret在管理站点中加载用户属性?如果是这样,你能提供一个例子吗?如何为应用授予适当的权限?
答案 0 :(得分:0)
如果您为加载项提供了正确的权限:
然后唯一可能出错的是用户权限。 SharePoint代码使用权限执行,权限是外接程序权限和当前用户权限的交集。