使用托管服务标识来调用SharePoint Online。可能?

时间:2018-10-01 09:05:55

标签: azure-active-directory sharepoint-online azure-logic-apps

我一直在Azure Logic应用程序和Azure Function应用程序中使用托管服务身份。我认为这是自切面包以来最好的事情,并且正在尝试启用各种方案,其中之一是使用MSI获取仅应用程序令牌并调用SharePoint Online。

使用Logic Apps,我为我的应用程序生成了一个托管服务标识,并在SharePoint应用程序上将其授予Sites.readwrite.All。然后,当使用HTTP动作时,我能够在使用托管服务身份作为身份验证并使用https://.sharepoint.com作为受众的同时调用REST端点。

然后,尽管我将更进一步,并创建一个功能应用程序并遵循相同的模式。我创建了该应用程序,生成了MSI,然后将其添加到Sites.readwrite。所有角色都与使用Logic App相同。

然后我使用下面的代码检索访问令牌并尝试生成一个clientcontext:

#r "Newtonsoft.Json"
using Newtonsoft.Json;
using System;
using System.Net; 
using System.Net.Http;
using System.Net.Http.Headers;
using Microsoft.SharePoint.Client;
public static void Run(string input, TraceWriter log)
{
    string resource = "https://<tenant>.sharepoint.com";
    string apiversion = "2017-09-01";
    using (var client = new HttpClient())
    {
        client.DefaultRequestHeaders.Add("Secret", Environment.GetEnvironmentVariable("MSI_SECRET"));
        var response = client.GetAsync(String.Format("{0}/?resource={1}&api-version={2}", Environment.GetEnvironmentVariable("MSI_ENDPOINT"), resource, apiversion)).Result;
            var responseContent = response.Content; 
            string responseString = responseContent.ReadAsStringAsync().Result.ToString();
            var json = JsonConvert.DeserializeObject<dynamic>(responseString);
            string accesstoken = json.access_token.ToString()
            ClientContext ctx = new ClientContext("<siteurl>");
            ctx.AuthenticationMode = ClientAuthenticationMode.Anonymous;
            ctx.FormDigestHandlingEnabled = false;
            ctx.ExecutingWebRequest += delegate (object sender, WebRequestEventArgs e){ 
                e.WebRequestExecutor.RequestHeaders["Authorization"] = "Bearer " + accesstoken;
            };
            Web web = ctx.Web;
            ctx.Load(web);
            ctx.ExecuteQuery();
            log.Info(web.Id.ToString());
    }
}

生成了承载令牌,但请求失败,拒绝了401访问(reason =“对请求进行身份验证时出错。”; category =“ invalid_client”)

我曾尝试将受众群体更改为00000003-0000-0ff1-ce00-000000000000 / .sharepoint.com @”,但这给出了另一个401错误,基本上是说它无法验证受众群体uri。(“ error_description”:“类型'Microsoft.IdentityModel.Tokens.AudienceUriValidationFailedException'的异常)。我还用REST呼叫代替了CSOM呼叫,该呼叫模仿了我使用Logic App所做的相同呼叫。

我对oauth 2的理解还不足以理解为什么我遇到问题以及下一步要去哪里。

为什么使用HTTP动作的Logic App调用起作用,为什么Function App不起作用?

有人吗?

1 个答案:

答案 0 :(得分:0)

一个非常基本的问题:您是否尝试过在资源字符串的末尾添加一个'/',例如https://[tenant].sharepoint.com/吗?

此问题在其他端点中也存在,因此也可能在这里受到干扰。