Sharepoint REST api和MVC AAD连接

时间:2018-01-04 17:11:12

标签: c# rest sharepoint azure-active-directory microsoft-graph

我需要在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的第二个选项,但欢迎任何帮助。

谢谢。

1 个答案:

答案 0 :(得分:1)

围绕搜索
graph search API功能有限,首先它只会搜索您要定位的当前网站集(驱动器),其次我不确定它是否支持按内容类型搜索(可能需要$过滤器...)
但如果符合你的约束条件,它可能是一个(更容易)的选择。

围绕身份验证&amp; AUTH
在这两种情况下(图形或SharePoint搜索),当人们到达您的应用程序(asp.net MVC)时会发生的情况是,身份验证中间件负责将用户重定向到AAD,获取应用程序的访问令牌,将其重定向到您的应用程序应用程序,它使用该访问令牌在应用程序上创建会话 我的观点是:在这一点上,你所拥有的只是:

  • 您应用的访问令牌(不是图表,不是SharePoint
  • 针对您应用的会话

您需要做一些事情才能访问SharePoint /图表:

  • 拦截并保留令牌服务器端(将其添加到会话中?)如果您的中间件实现尚未执行此操作
  • 使用该访问令牌+您的app id / secret / certificate来获取SharePoint的访问令牌/ AAD的图表
  • 确保您的应用程序在AAD中具有与SharePoint /正确图形API的
  • 对话的权限

以下是使用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) ,经典+欧文,别的什么?)。我建议你开始另一个问题,详细说明这一点。