从控制台应用程序获取SharePoint网站的标题

10

我有一个用C#编写的控制台应用程序,需要从SharePoint站点获取一些信息。这个SharePoint实例是Office 365的一部分(即SharePoint Online)。

我的挑战是,我不能使用助手库,必须使用基于REST的API,因为我使用的是.NET Core。

首先,我在Azure Active Directory中注册了我的控制台应用程序。这个控制台应用程序是在我Office 365环境所在的Azure Active Directory中创建的。我还向我的控制台应用程序授予了“读取所有网站集合中的项目”的委派权限,以便使用“Office 365 SharePoint Online”API。

在我的情况下,我有一个运行在服务器上的控制台应用程序。我已经在我的SharePoint租户上设置了一个测试用户,具有用户名/密码。我还拥有我在Azure Active Directory中注册的控制台应用程序的客户端ID和重定向URL。

此时,我有一些类似以下代码的代码:

var accessToken = await GetToken(); // retrieves a token from Active Directory
using(var client = new HttpClient()) {
    client
        .DefaultRequestHeaders
        .Clear();

    client
        .DefaultRequestHeaders
        .Authorization = new AuthenticationHeaderValue("Bearer", accessToken);

    client
        .DefaultRequestHeaders
        .Accept
        .Add(new MediaTypeWithQualityHeaderValue("application/json"));

    var apiUrl = "https://[mySite].sharepoint.com/_api/web";

    // how do I get the title of the site at the apiUrl variable?
}

我感觉很接近了,因为我已经获得了访问令牌。但是我似乎无法弄清楚如何获取网站的标题。我该如何从我的C#代码中获取SharePoint网站的标题?


下面有一些不错的答案,你能提供一下你实际获取令牌的代码吗?根据应用程序注册的类型,您可能需要其他方法来获取令牌。顺便说一句,微软现在在各个地方都在使用JWT令牌,并且它们包含有关其有效性的信息。只需将它们粘贴到https://jwt.io即可。 - Stephan
3个回答

2
SharePoint REST API的web资源包括一个Title属性,该属性代表网站的标题。
调用:
GET http://<site url>/_api/web/title

返回:
<d:Title xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" 
    xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" 
    xmlns:georss="http://www.georss.org/georss" 
    xmlns:gml="http://www.opengis.net/gml">Site Title Goes Here</d:Title>

或者,假设您已将“接受”标头设置为“application/json”:
{
  "odata.metadata": 
  "https://microsoft.sharepoint.com/sites/msw/_api/$metadata#Edm.String",
  "value": "MSW"
}

认证过程是什么?目前,我正在从Azure Active Directory获取OAuth令牌。但是,我仍然收到401错误。 - user687554
如果您正在使用v1端点,则SharePoint的范围可以在Azure AD门户中的应用程序注册屏幕中找到。您还需要将Resource更改为您的SharePoint租户的URI(而不是Microsoft Graph的https://graph.microsoft.com)。 - Marc LaFleur
有些服务器对服务器的流程需要您使用证书而不是密码进行身份验证。同时,将令牌(即JWT)复制并粘贴到https://jwt.io上也会有所帮助,如果它具有正确的属性,则令牌看起来会有所不同。 - Stephan

2

SharePoint的端点遵循OData约定。

因此,您可以使用


1

刚刚意识到您正在使用SharePoint API而不是Graph API,但它仍然可能对您有用!

这是JSON设置,您不需要它,但它将使反序列化更容易。

public class SharePointSiteObject
{
    [JsonProperty("createdDateTime")]
    public string CreatedDate { get; set; }

    [JsonProperty("description")]
    public string Description { get; set; }

    [JsonProperty("id")]
    public string ID { get; set; }

    [JsonProperty("lastModifiedDateTime")]
    public string LastModified { get; set; }

    [JsonProperty("name")]
    public string Name { get; set; }

    [JsonProperty("webUrl")]
    public string WebUrl { get; set; }

    [JsonProperty("displayName")]
    public string DisplayName { get; set; }

    [JsonProperty("createdBy")]
    public user CreatedBy { get; set; }

    [JsonProperty("lastModifiedBy")]
    public user ModifiedBy { get; set; }
}

反序列化返回的JSON的代码

public static SharePointSiteObject SharePointDeserialize(string jObject)
{
    SharePointSiteObject sharePointSite;

    sharePointSite = JsonConvert.DeserializeObject<SharePointSiteObject>(jObject);

    return sharePointSite;
}

通用的查询Graph API的方法,需要提供端点和令牌。

public static async Task<string> Run(string url, string token)
{

    var httpClient = new HttpClient();
    HttpResponseMessage response;
    try {
        var request = new HttpRequestMessage(HttpMethod.Get, url);
        request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);
        response = await httpClient.SendAsync(request);
        var content = await response.Content.ReadAsStringAsync();
        return content;
    }
    catch (Exception ex) {
        return ex.ToString();
    }
}

在需要调用图形 API 并显示 SharePoint 站点名称的地方使用以下代码

string url = "https://graph.microsoft.com/v1.0/sites/" + sharePointID;
string token = await GetToken();
var request = await Run(url, token);
var result = SharePointDeserialize(request);
Console.WriteLine(result.DisplayName);

你应该尝试使用MS Graph Explorer,它非常有用:https://developer.microsoft.com/zh-cn/graph/graph-explorer


谢谢您的回复。我尝试使用您的方法,但是我收到了一个“未经授权”的错误。这让我想到我可能没有正确的令牌。我确实有一个从https://login.microsoftonline.com/获取的令牌。我需要做更多的工作来获取特定的令牌吗? - user687554
如果您正在使用WPF,可以在此处https://github.com/Azure-Samples/active-directory-dotnet-desktop-msgraph-v2 中找到一个很好的示例。如果所有这些都失败了,如果您能展示一下您的代码,那就太好了。另外,您可以尝试 https://developer.microsoft.com/en-us/graph/docs/concepts/get-started。 - user9401448
我已经审查了代码。然而,这些示例要求用户通过OAuth提示输入其凭据。我的挑战是,我为我的应用程序分配了用户名和密码。我想通过这些凭据与SharePoint凭据进行交互。如果我已经有了用户名/密码,我该如何进行身份验证? - user687554
微软没有发布如何通过用户名/密码进行身份验证的示例,这是可能的,但我没有任何相关代码。Marc LaFleur的答案似乎更适合您的问题。 - user9401448

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接