REST搜索API远程服务器返回错误:(401)未经授权

本文关键字:授权 错误 API 搜索 返回 服务器 REST | 更新日期: 2023-09-27 17:58:07

我使用本教程创建了一个控制台应用程序:

http://blogs.msdn.com/b/kaevans/archive/2014/03/02/building-a-sharepoint-app-as-a-timer-job.aspx

当然,有一些不同之处,在我的控制台应用程序中,我想对搜索api进行rest调用。

阅读此文:给予应用程序主体权限而不是像我使用的示例中那样使用租户管理:

 <AppPermissionRequests>
    <AppPermissionRequest Scope="https://sharepoint/search" Right="QueryAsUserIgnoreAppPrincipal" />
  </AppPermissionRequests>

然后我转到"_layouts/AppInv.aspx",并使用上面的客户端id和xml注册了应用程序。

然后我点击了信任它。

我的app.config是这样的:

<xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="Sites"
             type="System.Configuration.NameValueSectionHandler"/>
  </configSections>
  <appSettings>
    <add key="ClientId" value="xx-1c6c-45e7-8a2a-7364a705c836"/>
    <add key="ClientSecret" value="+xx="/>
  </appSettings>
  <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
  <Sites>
    <add key="site1" value="https://xx.sharepoint.com/sites/developersitecollection"/>
  </Sites>
</configuration>

然后我的控制台应用程序失败,getresponse 上出现未经授权的异常

static void Main(string[] args)
        {
            var config = (NameValueCollection)ConfigurationManager.GetSection("Sites");

            foreach (var key in config.Keys)
            {
                Uri siteUri = new Uri(config.GetValues(key as string)[0]);
                using (ClientContext clientContext = new ClientContext(siteUri))
                {
                    string realm = TokenHelper.GetRealmFromTargetUrl(siteUri);
                    string accessToken =
                        TokenHelper.GetAppOnlyAccessToken(TokenHelper.SharePointPrincipal,
                        siteUri.Authority, realm).AccessToken;
                    HttpWebRequest endpointRequest = (HttpWebRequest)HttpWebRequest.Create(siteUri +"/_api/search/query?querytext=%27*.pptx%27");
                    endpointRequest.Method = "GET";
                    endpointRequest.Accept = "application/json;odata=verbose";
                    endpointRequest.Headers.Add("Authorization", "Bearer " + accessToken);
                    HttpWebResponse endpointResponse = (HttpWebResponse)endpointRequest.GetResponse();
                    StreamReader reader = new StreamReader(endpointResponse.GetResponseStream());
                    var searchXml = new XmlDocument();
                    searchXml.LoadXml(reader.ReadToEnd()); 
                }
            }
        }

我想知道可能有什么问题

REST搜索API远程服务器返回错误:(401)未经授权

QueryAsUserIgnoreAppPrincipal权限完全按照它所说的执行。。。它以当前用户身份查询搜索,忽略应用程序权限。您的代码只获得应用程序权限,不提供用户信息。在这种情况下,我预计401未经授权。

请记住,搜索查询是根据用户进行安全性调整的。您可能会尝试对仅应用程序上下文使用租户读取权限,删除QueryAsUserIgnoreAppOnly,但我还没有尝试看看这是否有效。更好的选择可能是简单地使用SharePointOnlineCredentials类来指定具有足够权限访问内容的用户(如果用户没有访问内容的权限,则内容将不会出现在搜索结果中)。

http://blogs.msdn.com/b/kaevans/archive/2014/02/23/call-o365-using-csom-with-a-console-application.aspx