【问题标题】:Retrieve siteId and listId from shared folder从共享文件夹中检索 siteId 和 listId
【发布时间】:2020-01-29 08:21:42
【问题描述】:

我目前正在从共享文件夹中检索 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的配置或者权限问题。

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

【问题讨论】:

    标签: c# sharepoint .net-core microsoft-graph-api microsoft-graph-sdks


    【解决方案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、...,您将能够检索它们。

    希望对您的回答有所帮助。

    【讨论】:

    • 访问令牌的范围是特定的应用程序、租户、用户和权限。如果其中任何一个不匹配,您将被拒绝访问。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-21
    相关资源
    最近更新 更多