我需要在C#中从服务器端执行此查询https://<tenant>.sharepoint.com/_api/search/query?querytext=%27contenttype:articles%27
到Sharepoint REST api。
我有来自MVC门户的Oauth2连接,所以我的目标是从连接中检索令牌并将其作为持有者令牌发送到sharepoint端点。
我的意思是那样的
string userObjectID = ClaimsPrincipal.Current.FindFirst("http://schemas.microsoft.com/identity/claims/objectidentifier").Value;
AuthenticationContext authContext = new AuthenticationContext(Startup.Authority, new NaiveSessionCache(userObjectID));
ClientCredential credential = new ClientCredential(clientId, appKey);
AuthenticationResult result = await authContext.AcquireTokenSilentAsync("https://<tenant>.sharepoint.com/", credential, new UserIdentifier(userObjectID, UserIdentifierType.UniqueId));
HttpClient client = new HttpClient();
HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "https://<tenant>.sharepoint.com/_api/search/query?querytext=%27contenttype:articles%27");
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", result.AccessToken);
HttpResponseMessage response = await client.SendAsync(request);
但显然,我无法检索令牌......
另一方面,我已经使用ADv2和GraphServiceClient构建了一个运行良好的应用程序,但我不知道如何在图表模型中翻译查询(并且我没有任何管理员同意)。
所以,我有2种方法可以解决我的问题,我希望更好地使用microsoft graph api的第二个选项,但欢迎任何帮助。
谢谢。
答案 0 :(得分:1)
围绕搜索
graph search API功能有限,首先它只会搜索您要定位的当前网站集(驱动器),其次我不确定它是否支持按内容类型搜索(可能需要$过滤器...)
但如果符合你的约束条件,它可能是一个(更容易)的选择。
围绕身份验证&amp; AUTH 强>
在这两种情况下(图形或SharePoint搜索),当人们到达您的应用程序(asp.net MVC)时会发生的情况是,身份验证中间件负责将用户重定向到AAD,获取应用程序的访问令牌,将其重定向到您的应用程序应用程序,它使用该访问令牌在应用程序上创建会话
我的观点是:在这一点上,你所拥有的只是:
您需要做一些事情才能访问SharePoint /图表:
以下是使用MSAL从“我有访问令牌到我的app / api”到“我有一个访问令牌到图/ SharePoint”的示例。
注意:我在这里使用证书,但您可能正在使用秘密
var cac = new ClientAssertionCertificate(ApplicationId, CertificateProvider.AppCertificate);
var ua = new UserAssertion(apiAccessToken);
authenticationResult = await authContext.AcquireTokenAsync(resource, cac, ua);
我没有提供有关如何拦截令牌的代码/在此处获取它,因为您的问题不清楚您当前的身份验证和授权配置以及您使用的MVC“风格”(asp.net core + middlewares) ,经典+欧文,别的什么?)。我建议你开始另一个问题,详细说明这一点。