Использование идентификатора управляемой службы для вызова в SharePoint Online.Возможный? - PullRequest
0 голосов
/ 01 октября 2018

Я поигрался с идентификацией управляемых сервисов в приложениях логики Azure и приложениях-функциях Azure.Я думаю, что это лучшее, что есть нарезанный хлеб, и я пытаюсь включить различные сценарии, один из которых - использовать MSI для получения токена только для приложения и вызова в SharePoint Online.

Используя приложения логики, я сгенерировалудостоверение управляемой службы для моего приложения и присвоение ему Sites.readwrite.All в приложении SharePoint.Затем, используя HTTP-действие, я смог вызвать конечные точки REST, используя идентификацию Managed Service Identity в качестве аутентификации и используя https: //.sharepoint.com в качестве аудитории.

Тогда я решил сделать шагдалее и создайте приложение-функцию и следуйте тому же шаблону.Я создал приложение, сгенерировал MSI, добавил его роль Sites.readwrite.All так же, как и в приложении логики.

Затем я использовал приведенный ниже код, чтобы получить токен доступа и попытаться сгенерировать 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 (причина = "Произошла ошибка при аутентификации запроса."; Category = "invalid_client")

Я попытался изменить аудиторию на 00000003-0000-0ff1-ce00-000000000000 / .sharepoint.com @ ", но это дает другую ошибку 401, в основном утверждая, что она не может проверить URI аудитории. (" Error_description ":" Exception ofтип «Microsoft.IdentityModel.Tokens.AudienceUriValidationFailedException» был выдан.).Я также заменил вызов CSOM на вызов REST, имитирующий тот же вызов, который я делал с помощью приложения логики.

Мое понимание oauth 2 недостаточно для того, чтобы понять, почему я сталкиваюсь с проблемой и гдесмотрите далее.

Почему работает вызов приложения логики с использованием действия HTTP и почему не работает приложение функций ??

Кто-нибудь?

1 Ответ

0 голосов
/ 03 октября 2018

Довольно простой вопрос: пытались ли вы поставить '/' в конце строки ресурса, например, https://[tenant].sharepoint.com/?

Эта проблема также присутствует в других конечных точках, поэтому возможно, что еевмешивается и здесь.

...