在MVA课程的模块2中,标题为“深入挖掘SharePoint数据存储列表”的SharePoint平台构建块和服务(大约45分钟后)Ted Pattison做了一个使用控制台应用程序创建列表的演示在SharePoint Online网站上。课程在http://www.microsoftvirtualacademy.com/training-courses/deep-dive-building-blocks-and-services-of-sharepoint
我正在尝试在我的环境中做同样的事情,但我遇到了麻烦。
在演示中,他访问了_layouts / 15 / AppRegNew.aspx,在app注册表中注册了一个新应用。在演示中,页面顶部有一个“应用类型”单选按钮列表,其中包含“在Web服务器上运行的应用程序”和“在客户端计算机上运行的应用程序”选项。当我在我的网站上访问此页面时,没有这样的单选按钮列表。同样在演示中,Ted将重定向URL留空。在我的网站上,它是必需的: 为了解决这个问题,我输入了我网站的网址(https://mydomain.sharepoint.com/sites/test)。应用ID已成功创建:
然后我去了_layouts / 15 / AppInv.aspx来为应用程序提供安全保障。我粘贴在CAML中,为应用程序提供对网络的读取权限:
<AppPermissionRequests>
<AppPermissionRequest Scope="http://sharepoint/content/sitecollection/web" Right="Read" />
</AppPermissionRequests>
然后通过Clicking Trust It来信任该应用程序:
然后我将App注册中的值复制到app.config中:
<add key="targetSiteUrl" value="https://xxxxx.sharepoint.com/sites/test"/>
<add key="clientId" value="bf4c37ef-9202-41ba-8430-3983cba26285"/>
<add key="clientSecret" value="nKGefHSvT69Ls2rwq1AIVyyHkIwlBzT9UkpbJMUcIbw="/>
<add key="deleteOnly" value="false"/>
然后根据演示中的内容创建代码以获取网站标题:
static void Main(string[] args)
{
string siteUrl = ConfigurationManager.AppSettings["targetSiteUrl"];
bool deleteOnly = ConfigurationManager.AppSettings["deleteOnly"].Equals("true");
Uri siteUri = new Uri(siteUrl);
string realm = TokenHelper.GetRealmFromTargetUrl(siteUri);
var accessToken = TokenHelper.GetAppOnlyAccessToken(TokenHelper.SharePointPrincipal,
siteUri.Authority, realm).AccessToken;
using (var clientContext = TokenHelper.GetClientContextWithAccessToken(siteUrl, accessToken)) {
var web = clientContext.Web;
clientContext.Load(web);
clientContext.ExecuteQuery();
Console.WriteLine(web.Title);
}
}
上面的代码获取领域和访问令牌并成功创建clientContext,但是当我运行executeQuery时,我总是得到错误Microsoft.SharePoint.Client.ServerUnauthorizedAccessException。我试过让应用程序ID完全控制Web,网站集和租户,但我仍然得到同样的错误。
如何让我的控制台应用程序拥有对我网站的更新权限?
答案 0 :(得分:1)
我在appinv.aspx中添加权限时需要设置AllowAppOnlyPolicy
<AppPermissionRequests AllowAppOnlyPolicy="true" >