【问题标题】:Sharepoint REST api and MVC AAD connectSharepoint REST api 和 MVC AAD 连接
【发布时间】:2018-01-04 17:11:12
【问题描述】:

我需要从 C# 的服务器端通过 Sharepoint REST api 执行此查询 https://<tenant>.sharepoint.com/_api/search/query?querytext=%27contenttype:articles%27

我有来自 MVC 门户的 Oauth2 连接,所以我的目标是从连接中检索令牌并将其作为不记名令牌发送到共​​享点端点。

我的意思是这样的

  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 的第二个选项,但欢迎提供任何帮助。

谢谢。

【问题讨论】:

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


    【解决方案1】:

    周围搜索
    graph search API 的功能有限,首先它只会在您定位的当前网站集(驱动器)中搜索,其次我不确定它是否支持按内容类型搜索(可能使用 $filter. ..)
    但如果这符合您的限制条件,它可能是一个(更简单的)选择。

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

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

    您需要做几件事才能访问 SharePoint/图表:

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

    这是一个示例,说明如何使用 MSAL 从“我有我的应用程序/api 的访问令牌”到“我有一个图表/SharePoint 的访问令牌”。
    注意:我在这里使用的是证书,但您可以使用密钥来代替

    var cac = new ClientAssertionCertificate(ApplicationId, CertificateProvider.AppCertificate);
                var ua = new UserAssertion(apiAccessToken);
                authenticationResult = await authContext.AcquireTokenAsync(resource, cac, ua);
    

    我没有在此处提供有关如何拦截令牌/获取令牌的代码,因为您的问题不清楚您当前的身份验证和授权配置以及您使用的 MVC“风格”(asp.net 核心 + 中间件) ,经典+ owin,还有别的吗?)。我建议您开始另一个问题,详细了解该特定点。

    【讨论】:

    • 感谢您的详细解释。首先,您能否确认 ADv2 的 MSAL (Microsoft.Identity.Client) 和旧协议的 ADAL (Microsoft.IdentityModel.Clients.ActiveDirectory)?我已经设置了两种方法,我的目标可能是使用 MSAL (ADv2) 构建所有方法,除非 MSAL 太年轻而无法使用。
    • 如您所见(链接如下)MSAL 是 Microsoft 在使用 v2 端点时推荐的库 docs.microsoft.com/en-us/azure/active-directory/develop/… 不要忘记标记为答案 ;-)
    • 好的,它与我之前看到的相符,我怀疑您在 ADAL (Microsoft.IdentityModel.Clients.ActiveDirectory) 上发送的答案中的 url MSAL
    猜你喜欢
    • 2017-01-30
    • 2021-11-10
    • 1970-01-01
    • 1970-01-01
    • 2019-03-15
    • 2014-01-14
    • 2017-02-27
    • 1970-01-01
    • 2019-01-05
    相关资源
    最近更新 更多