首页 > 解决方案 > SharePoint 2019 搜索 REST API 返回 401 Unauthorized - 当使用基本授权请求标头从 C# 调用时

问题描述

我有自己的 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 request-id: 47049f9f-8244-1032-40ac-07df48a24632 X-Frame-Options: SAMEORIGIN SPRequestDuration: 6 SPIisLatency: 2 WWW-Authenticate: NTLM X-Powered-By: ASP.NET MicrosoftSharePointTeamServices: 16.0。 0.10368 X-Content-Type-Options:nosniff X-MS-InvokeApp:1;RequireReadOnly 日期:2021 年 1 月 7 日星期四 18:24:18 GMT 内容长度:0 }

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

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

标签: c#authenticationsearchsharepointauthorization

解决方案


我能够找到解决方案。最重要的一行是 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;
                }
            }
        }

推荐阅读