C# 从共享文件夹中检索siteId和listId

C# 从共享文件夹中检索siteId和listId,c#,sharepoint,.net-core,microsoft-graph-api,microsoft-graph-sdks,C#,Sharepoint,.net Core,Microsoft Graph Api,Microsoft Graph Sdks,我目前正在从共享文件夹中检索siteId和listId。 到目前为止,我在Sharepoint文件夹中成功地执行了此操作,在该文件夹中我可以访问Sharepoint根目录,但当我使用共享Sharepoint位置的URL时,我收到以下错误消息: “租约的主机名无效” 从上下文来看,我的用例如下: 我的一位同事与我共享一个来自Sharepoint(xxx.Sharepoint.com)的文件夹 我有权访问他的文件夹 如果我只是去根目录(xxx.sharepoint.com),我会被“拒绝访问”,这

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

从上下文来看,我的用例如下:

  • 我的一位同事与我共享一个来自Sharepoint(xxx.Sharepoint.com)的文件夹
  • 我有权访问他的文件夹
  • 如果我只是去根目录(xxx.sharepoint.com),我会被“拒绝访问”,这很好(我相信)
  • 我想使用此文件夹的URL从共享文件夹中检索sideId、listId(以及最终的driveId)
到目前为止,正如我前面所说,我能够检索sharepoint文件夹中的这些信息,我确实可以访问该文件夹的根目录。 不幸的是,在我之前描述的用例中,我有一个错误,即使检索我有权访问的所有站点或从文件夹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;
}
公共异步任务url列表(字符串访问令牌,字符串url)
{
url=url.Replace(“/Forms/AllItems.aspx”,”);
Uri=新的Uri(url);
var segments=string.Join(“,uri.segments[0..^1]).TrimEnd('/');
var request=graphClient.Sites[uri.Host].SiteWithPath(segments).list.request(Options(accessToken));
var lists=wait request.GetAsync();
var list=lists.First(l=>string.Compare(url,l.WebUrl,true)==0);
退货清单;
}
到目前为止,我只看到两种选择。。。它可能来自xxx.sharepoint.com的配置或权限问题


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

在尝试不同的解决方案后,由于用户和sharepoint目标之间的租约不同,出现此错误的确切原因是什么

要解决此问题,您首先需要使用空承载器对url xxx.sharepoint.com/site/subsite/Forms/AllItems.aspx执行HTTP Get请求。从中可以找到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;
}
public异步任务GetAccessToken(string clientId、string clientSecret、string scope、string refreshtToken、string grantType=“refresh\u token”、string tenantId=“common”)
{
var request=newhttprequestmessage(HttpMethod.Post,$)https://login.microsoftonline.com/{tenantId}/oauth2/v2.0/token”);
request.Content=newformurlencodedcontent(newdictionary(){
{“client_id”,clientId},
{“范围”,范围},
{“刷新令牌”,刷新令牌},
{“grant_type”,grantType},
{“客户机密”,客户机密}
});
HttpResponseMessage response=等待客户端.SendAsync(请求);
response.EnsureSuccessStatusCode();
var result=await response.Content.ReadAsStringAsync();
返回结果;
}
如果您请求sideId、listId、…,则使用此访问令牌,。。。对于给定的sharepoint目标,您将能够检索它们


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

访问令牌的作用域是特定的应用程序、租户、用户和权限。如果其中任何一项不匹配,您将被拒绝访问。