C# 访问sharepoint搜索rest api

C# 访问sharepoint搜索rest api,c#,asp.net,azure,sharepoint,C#,Asp.net,Azure,Sharepoint,我有个问题。我使用Azure AD验证我的asp.net应用程序。身份验证工作正常。然后,我从该应用程序尝试使用sharepoint search rest api访问OneDrive for Business。但是服务器总是收到带有401错误的响应。我知道问题在于我使用的访问令牌(现在我使用从Azure AD接收的令牌)。但我从未找到如何为sharepoint search rest api获取访问令牌的常规描述 提前感谢回答 您需要授予ASP.NET应用程序使用OneDrive for Bu

我有个问题。我使用Azure AD验证我的asp.net应用程序。身份验证工作正常。然后,我从该应用程序尝试使用sharepoint search rest api访问OneDrive for Business。但是服务器总是收到带有401错误的响应。我知道问题在于我使用的访问令牌(现在我使用从Azure AD接收的令牌)。但我从未找到如何为sharepoint search rest api获取访问令牌的常规描述

提前感谢

回答 您需要授予ASP.NET应用程序使用OneDrive for Business应用程序的权限

下面是如何使用Azure管理门户进行此操作的概述。(请注意,您的OneDrive for Business帐户是一种Office 365 SharePoint Online帐户。)

转到manage.windowsazure.com>Active Directory>您的租户。如果您的租户具有关联的OneDrive for Business帐户,则其应用程序列表将包括Office 365 SharePoint Online。

如果租户的应用程序列表中确实包含Office 365 SharePoint Online,则下一步是授予ASP.NET Web应用程序访问它的权限

在Azure Active Directory区域中打开Web应用程序的页面。然后选择配置>添加应用程序。添加Office 365 SharePoint Online应用程序。授予它所有必要的权限并保存

下面的屏幕截图是针对本机客户端应用程序的,因为我的演示代码正在使用本机客户端应用程序。您可以对Web应用程序执行类似的操作,不过您需要使用X509证书进行身份验证,而不是用户名/密码

using Microsoft.IdentityModel.Clients.ActiveDirectory;
using System.Net;

namespace AAD_SharePointOnlineApp
{
    class Program
    {
        static void Main(string[] args)
        {
            var authContext =
                new AuthenticationContext(Constants.AUTHORITY);

            var userCredential = 
                new UserCredential(Constants.USER_NAME, Constants.USER_PASSWORD);

            var result = authContext
                .AcquireTokenAsync(Constants.RESOURCE, Constants.CLIENT_ID_NATIVE, userCredential)
                .Result;

            var token = result.AccessToken;

            var url = "https://mvp0.sharepoint.com/_api/search/query?querytext=%27timesheets%27";
            var request = WebRequest.Create(url);
            request.Headers.Add(HttpRequestHeader.Authorization, "Bearer " + token);
            var response = request.GetResponse() as HttpWebResponse;
        }
    }

    class Constants
    {
        public const string AUTHORITY =
            "https://login.microsoftonline.com/mvp0.onmicrosoft.com/";
    
        public const string RESOURCE =
            "https://mvp0.sharepoint.com";

        public const string CLIENT_ID_NATIVE = 
            "xxxxx-xxxx-xxxxx-xxxx-xxxxx-xxxx";

        public const string USER_NAME = 
            "MY_USER@mvp0.onmicrosoft.com";

        public const string USER_PASSWORD = 
            "MY_PASSWORD";
    }
}

您的访问令牌现在将与您的Office 365 for Business帐户一起使用。万岁

演示 下面是一些在我的机器上使用本机客户端应用程序的示例代码。您可以对Web应用程序执行相同的操作,不过您需要使用X509证书而不是用户名/密码

using Microsoft.IdentityModel.Clients.ActiveDirectory;
using System.Net;

namespace AAD_SharePointOnlineApp
{
    class Program
    {
        static void Main(string[] args)
        {
            var authContext =
                new AuthenticationContext(Constants.AUTHORITY);

            var userCredential = 
                new UserCredential(Constants.USER_NAME, Constants.USER_PASSWORD);

            var result = authContext
                .AcquireTokenAsync(Constants.RESOURCE, Constants.CLIENT_ID_NATIVE, userCredential)
                .Result;

            var token = result.AccessToken;

            var url = "https://mvp0.sharepoint.com/_api/search/query?querytext=%27timesheets%27";
            var request = WebRequest.Create(url);
            request.Headers.Add(HttpRequestHeader.Authorization, "Bearer " + token);
            var response = request.GetResponse() as HttpWebResponse;
        }
    }

    class Constants
    {
        public const string AUTHORITY =
            "https://login.microsoftonline.com/mvp0.onmicrosoft.com/";
    
        public const string RESOURCE =
            "https://mvp0.sharepoint.com";

        public const string CLIENT_ID_NATIVE = 
            "xxxxx-xxxx-xxxxx-xxxx-xxxxx-xxxx";

        public const string USER_NAME = 
            "MY_USER@mvp0.onmicrosoft.com";

        public const string USER_PASSWORD = 
            "MY_PASSWORD";
    }
}
评论 如果试图使用Web应用程序而不是本机客户端应用程序执行上述操作,则需要使用X509证书,否则将收到以下错误

不支持的仅应用程序令牌

另见: