Несанкционированный: доступ запрещен из-за неверных учетных данных. Microsoft Graph API для sharepoint - PullRequest
0 голосов
/ 17 марта 2020

Я использую следующий код:

  string cSecret = "XXXXXXXXXXXX";
    string cId = "XXXXXXXXXXXXXXX";
    var scopes = new string[] { "https://graph.microsoft.com/.default" };
    var confidentialClient = ConfidentialClientApplicationBuilder
  .Create(cId)
  .WithRedirectUri($"https://login.microsoftonline.com/XXXXX.onmicrosoft.com/v2.0")
  .WithClientSecret(cSecret)
  .Build();

    string requestUrl;
    GraphServiceClient graphClient =
    new GraphServiceClient(new DelegateAuthenticationProvider(async (requestMessage) =>
    {
        var authResult = await confidentialClient
.AcquireTokenForClient(scopes)
.ExecuteAsync();

        // Add the access token in the Authorization header of the API request.
        requestMessage.Headers.Authorization =
        new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", authResult.AccessToken);
    }));


    requestUrl = "https://graph.microsoft.com/beta/search/query";

    var searchRequest = new
    {
        requests = new[]
                {
        new
        {
            entityTypes = new[] {"microsoft.graph.driveItem"},
            query = new
            {
                query_string = new
                {
                    query = "policy AND filetype:docx"
                }
            },
            from = 0,
            size = 25
        }
    }
    };
    //construct a request
    var message = new HttpRequestMessage(HttpMethod.Post, requestUrl);
    var jsonPayload = graphClient.HttpProvider.Serializer.SerializeObject(searchRequest);
    message.Content = new StringContent(jsonPayload, Encoding.UTF8, "application/json");
    await graphClient.AuthenticationProvider.AuthenticateRequestAsync(message);
    var response = await graphClient.HttpProvider.SendAsync(message);
    //process response 
    var content = await response.Content.ReadAsStringAsync();
    var result = JObject.Parse(content);
    var searchItems = result["value"].First["hitsContainers"].First["hits"].Select(item =>
    {
        var itemUrl = (string)item["_source"]["webUrl"];
        return itemUrl;
    });

Когда я запускаю этот код, я получаю следующее исключение:

Не авторизовано: доступ запрещен из-за неверных учетных данных. У вас нет разрешения на просмотр этого каталога или страницы с использованием предоставленных вами учетных данных. Я установил разрешение приложения https://graph.microsoft.com/Sites.Read.All.

Пожалуйста, помогите.

1 Ответ

0 голосов
/ 17 апреля 2020

Аутентификация приложения в настоящее время не поддерживается для API запросов. Обратитесь к поисковой документации , вам потребуются перечисленные делегированные разрешения в зависимости от того, что вы ищете:

  • Mail.Read
  • Файлы. Read.All
  • Calendars.Read
  • ExternalItem.Read.All

Примечание, как правило, Authority в формате " https://login.microsoftonline.com/XXXXX.onmicrosoft.com/v2.0 ", а не Redirect Uri . Возможно, вам придется изменить ConfidentialClientApplicationBuilder для использования .WithAuthority () . Затем вы можете использовать .WithRedirectUri (...) , используя значение, установленное при регистрации вашего приложения (если оно у вас есть, поскольку они являются необязательными).

См. Фрагмент кода из примера:

var redirectUri = "https://localhost:8080";    
var authority = $"https://login.microsoftonline.com/{config["tenantId"]}/v2.0";

List<string> scopes = new List<string>();
scopes.Add("https://graph.microsoft.com/.default");

var cca = ConfidentialClientApplicationBuilder.Create(clientId)
                                              .WithAuthority(authority)
                                              .WithRedirectUri(redirectUri)
                                              .WithClientSecret(clientSecret)
                                              .Build();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...