【问题标题】:SharePoint 2019 Search REST API Is Returning 401 Unauthorized - When Called from C# Using Basic Authorization Request HeaderSharePoint 2019 搜索 REST API 返回 401 Unauthorized - 当使用基本授权请求标头从 C# 调用时
【发布时间】:2021-01-07 19:02:11
【问题描述】:

我有自己的 C# Web API 服务(面向 .NET 5.0),它位于本地 SharePoint 2019 所在的同一台服务器上。我的代码调用内置的 SharePoint REST API 来进行搜索并返回结果(外界只会访问我的服务)。

我从该服务器上的 IE 调用 SharePoint REST API 没有问题。

在我的 Web API 服务 (https) 中,我使用与 IE 相同的 URL 调用 SharePoint Rest 服务 (http)

using (var client = new HttpClient())
{
     client.BaseAddress = new Uri(sharePointSearchServiceBaseUrl); 
     client.DefaultRequestHeaders.Clear();
     client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

     var plainTextBytes = System.Text.Encoding.UTF8.GetBytes("account:password");
     string val = System.Convert.ToBase64String(plainTextBytes);
     client.DefaultRequestHeaders.Add("Authorization", "Basic " + val);

     HttpResponseMessage response = await client.GetAsync("search/query?querytext='(oil*)'&rowlimit=100");

     if (response.IsSuccessStatusCode) 
     {
        var objResponse = response.Content.ReadAsStringAsync().Result;                        
        return Content(objResponse);
     }
    

很遗憾,client.GetAsync 的结果总是如下:

INFO 2021-01-07 01:24:18 状态码:401,ReasonPhrase:“未经授权”,版本:1.1,内容:System.Net.Http.HttpConnectionResponseContent,标头: { 服务器:Microsoft-IIS/10.0 SPRequestGuid:47049f9f-8244-1032-40ac-07df48a24632 请求 ID:47049f9f-8244-1032-40ac-07df48a24632 X 框架选项:SAMEORIGIN SPRequestDuration:6 SPIisLatency: 2 WWW-认证:NTLM X-Powered-By: ASP.NET 微软SharePointTeamServices:16.0.0.10368 X-Content-Type-Options: nosniff X-MS-InvokeApp:1;要求只读 日期:格林威治标准时间 2021 年 1 月 7 日星期四 18:24:18 内容长度:0 }

我已尝试传递我拥有的所有 SharePoint 帐户,所有这些帐户都给了我相同的 401。

任何解决此问题的见解将不胜感激。

【问题讨论】:

    标签: c# authentication search sharepoint authorization


    【解决方案1】:

    我能够找到解决方案。最重要的一行是 NetworkCredential 行。我尝试了许多其他方法,但这是唯一对我有用的方法。

    using (var handler = new HttpClientHandler())
       {
                handler.Credentials =  new NetworkCredential(account, password, domain); 
                using (var client = new HttpClient(handler))
                {
                    var requri = new Uri("http://localhost:30001/_api/search/query?querytext='(oil*)'&rowlimit=100");
                    HttpResponseMessage response = await client.GetAsync(requri);
    
                    if (response.IsSuccessStatusCode)
                    {
                        var objResponse = response.Content.ReadAsStringAsync().Result;
                        _logger.LogInformation("Results are: " + objResponse);
                        return Content(objResponse);
                    }
                    else
                    {
                        _logger.LogInformation("Sharepoint service call - was NOT successful");
                        _logger.LogInformation(response.ToString());
                        return null;
                    }
                }
            }
    

    【讨论】:

      猜你喜欢
      • 2016-12-04
      • 1970-01-01
      • 2017-11-15
      • 2020-03-24
      • 1970-01-01
      • 2018-04-28
      • 1970-01-01
      • 2014-05-14
      • 2019-01-05
      相关资源
      最近更新 更多