我使用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");
}
答案 0 :(得分:1)
因为您使用应用程序登录访问资源,所以使用TokenHelper.GetAppOnlyAccessToken,您必须添加AllowAppOnlyPolicy =&#34; true&#34;属性为AppPermissionRequest。
友好提醒,当AllowAppOnlyPolicy属性为true时,客户端ID和客户端密钥应被视为用户名和密码,尤其是在应用程序具有高权限的情况下,例如租户管理员或对网站集的完全控制权。在任何情况下,客户端密钥都应该受到保护,但如果AllowAppOnlyPolicy为false,则必须与经过身份验证的用户合并。