SharePoint Online - 通过CSOM应用程序

时间:2015-04-29 19:32:57

标签: c# sharepoint csom sharepoint-online sharepoint-apps

我有一个控制台应用程序,我通过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在管理站点中加载用户属性?如果是这样,你能提供一个例子吗?如何为应用授予适当的权限?

1 个答案:

答案 0 :(得分:0)

如果您为加载项提供了正确的权限:

  1. http://sharepoint/social/core
  2. http://sharepoint/social/tenant
  3. 然后唯一可能出错的是用户权限。 SharePoint代码使用权限执行,权限是外接程序权限和当前用户权限的交集。