2

我目前正在从共享文件夹中检索 siteId 和 listId 。到目前为止,我设法在可以访问 Sharepoint 根目录的 Sharepoint 文件夹上执行此操作,但是当我使用共享 Sharepoint 位置的 URL 时,我收到以下错误消息:“租户的主机名无效”

对于一些上下文,我的用例如下:

  • 我的一位同事通过 Sharepoint (xxx.sharepoint.com) 与我共享一个文件夹。
  • 我可以访问他的文件夹。
  • 如果我只是转到根目录(xxx.sharepoint.com),我会遇到“拒绝访问”,这很好(我相信)。
  • 我想使用此文件夹的 URL 从共享文件夹中检索 sideId、listId(最终是 driveId)。

到目前为止,正如我之前所说,我能够为我可以访问根目录的共享点文件夹检索这些信息。不幸的是,在我之前描述的用例中,我有一个错误,即使通过检索我有权访问的所有站点或从文件夹 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 的配置或权限问题。

有没有可能的方法来检索这些信息?如果是这样,怎么做?是否还有任何代码示例可用?

4

1 回答 1

1

在尝试了不同的解决方案后,由于用户和共享点目标之间的租用不同,导致此错误的确切原因。

要解决它,您首先需要使用空承载对 url xxx.sharepoint.com/site/subsite/Forms/AllItems.aspx 执行 HTTP Get 请求。从中您将找到共享点目标的tenantId。

获得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、...,您将能够检索它们。

希望它能帮助你回答这个问题。

于 2020-01-30T08:23:53.297 回答