Я поигрался с идентификацией управляемых сервисов в приложениях логики 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 и почему не работает приложение функций ??
Кто-нибудь?