Получить siteId и listId из общей папки - PullRequest
2 голосов
/ 29 января 2020

В настоящее время я работаю над извлечением siteId и listId из общих папок. Пока мне удается это сделать в папке Sharepoint, где у меня есть доступ к Sharepoint root, но когда я использую URL-адрес общего ресурса Sharepoint, у меня появляется следующее сообщение об ошибке: «Неверное имя хоста для арендатора»

Для некоторого контекста мой пример использования следующий:

  • Мой коллега делится со мной папкой с Sharepoint (xxx.sharepoint.com).
  • У меня есть доступ к его папке.
  • Если я просто go на root (xxx.sharepoint.com), у меня "отказано в доступе", что нормально (я считаю).
  • Я хочу получить sideId, listId (и, в конечном итоге, driveId) из общей папки, используя URL-адрес этой папки.

Пока, как я уже говорил ранее, я могу получить эти информация для папки sharepoint, где у меня есть доступ к root. К сожалению, в моем случае использования, описанном ранее, у меня есть ошибка, и я не могу получить ее, даже извлекая все сайты, к которым у меня есть доступ, или получая список по URL-адресу папки.

Часть кода что я использую до сих пор:

public async Task<List> UrlToList(string accessToken, string url)
{
    url = url.Replace("/Forms/AllItems.aspx", "");
    Uri uri = new Uri(url);
    var segments = string.Join("", uri.Segments[0..^1]).TrimEnd('/');

    var request = graphClient.Sites[uri.Host].SiteWithPath(segments).Lists.Request(Options(accessToken));
    var lists = await request.GetAsync();

    var list = lists.First(l => string.Compare(url, l.WebUrl, true) == 0);
    return list;
}

Пока я вижу только два варианта ... Это может быть связано с конфигурацией xxx.sharepoint.com или проблемой с правами доступа.

Есть ли какой-нибудь возможный способ получить эту информацию? Если так, то как? И есть ли где-нибудь еще пример кода?

1 Ответ

1 голос
/ 30 января 2020

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

Чтобы решить его, сначала необходимо выполнить запрос HTTP Get для URL-адреса xxx. sharepoint.com/site/subsite/Forms/AllItems.aspx с пустым носителем. Отсюда вы найдете tenantId получателя sharepoint.

После того, как у вас есть tenantId, вам потребуется запросить новый токен доступа с этим tenantId, как в следующем примере.

public async Task<string> GetAccessToken(string clientId, string clientSecret, string scope, string refreshToken, string grantType = "refresh_token", string tenantId = "common")
{
    var request = new HttpRequestMessage(HttpMethod.Post, $"https://login.microsoftonline.com/{tenantId}/oauth2/v2.0/token");
    request.Content = new FormUrlEncodedContent(new Dictionary<string, string>() {
        {"client_id", clientId },
        {"scope", scope },
        {"refresh_token", refreshToken },
        {"grant_type", grantType },
        {"client_secret", clientSecret }
    });

    HttpResponseMessage response = await client.SendAsync(request);

    response.EnsureSuccessStatusCode();

    var result = await response.Content.ReadAsStringAsync();
    return result;
}

С этот токен доступа, если вы запросите sideId, listId, ... данного адресата sharepoint, вы сможете получить их.

Надеюсь, он поможет вам с этим ответом.

...