'访问被拒绝'使用应用程序权限访问SharePoint Online网站集

时间:2017-10-25 15:13:30

标签: sharepoint sharepoint-online csom

我使用Site Collections /AppRegNew.aspx页面在SharePoint Online中创建了一个App Principal,然后使用页面/appInv.aspx使用以下权限XML授予该网站集的App Principal FullControl:

<AppPermissionRequests>
  <AppPermissionRequest Scope="http://sharepoint/content/sitecollection" Right="FullControl"/>
</AppPermissionRequests>

但是,当我尝试使用CSOM和c#(使用TokenHelper.cs)访问该网站集中的列表时,我收到错误:

'Access denied. You do not have permission to perform this action or access this resource.'

我有另一个App Principal我已授予Tenant Admin测试权限 - 如果我使用与该App Principal关联的ClientID和ClientSecret,我的代码运行正常(我只是阅读一些列表项目进行测试)

我是否在使用AppPermissionRequests XML做错了什么?我还缺少一些其他措施吗?我可以使用租户管理员应用程序负责人,但我想这样做是对的&#39;方式 - 从我的研究来看,它看起来应该使用SiteCollection FullControl权限。

我用来尝试访问的示例代码:

        Uri siteUri = new Uri("https://MyCompany.sharepoint.com/sites/johntest");
        string realm = TokenHelper.GetRealmFromTargetUrl(siteUri);
        string accessToken = TokenHelper.GetAppOnlyAccessToken(TokenHelper.SharePointPrincipal, siteUri.Authority, realm).AccessToken;
        using (ClientContext context = TokenHelper.GetClientContextWithAccessToken(siteUri.ToString(), accessToken))
        {

            Web thisWeb = context.Web;
            context.Load(thisWeb);
            context.ExecuteQuery();
            List roomsList = context.Web.Lists.GetByTitle("Rooms");
            context.Load(roomsList);
            context.ExecuteQuery();
            Console.WriteLine("List retrieved");
            CamlQuery camlQuery = new CamlQuery();
            camlQuery.ViewXml = "<View><Query><Where><Eq><FieldRef Name='Title'/><Value Type='Text'>SomeValue</Value></Eq></Where></Query></View>";
            ListItemCollection listItems = roomsList.GetItems(camlQuery);
            context.Load(listItems);
            context.ExecuteQuery();
            Console.WriteLine("Query succeeded");
        }

1 个答案:

答案 0 :(得分:1)

因为您使用应用程序登录访问资源,所以使用TokenHelper.GetAppOnlyAccessToken,您必须添加AllowAppOnlyPolicy =&#34; true&#34;属性为AppPermissionRequest。

友好提醒,当AllowAppOnlyPolicy属性为true时,客户端ID和客户端密钥应被视为用户名和密码,尤其是在应用程序具有高权限的情况下,例如租户管理员或对网站集的完全控制权。在任何情况下,客户端密钥都应该受到保护,但如果AllowAppOnlyPolicy为false,则必须与经过身份验证的用户合并。