C#中通过Client ID和Client Secret使用SharePoint REST API获取网站集与站点分类
前置权限配置
- 确认已在Azure AD完成应用注册,为应用授予应用类型的
Sites.Read.All权限,且已由全局管理员完成权限同意 - 提前准备好租户对应的SharePoint基础域名(例如
contoso.sharepoint.com),确认应用身份对租户SharePoint管理中心站点有访问权限
鉴权逻辑(可复用现有Graph鉴权的核心配置)
不需要重写鉴权框架,仅需要调整令牌请求的目标资源范围为SharePoint资源,即可完成带客户端凭据的身份校验,核心代码如下:
// 复用原有的Client ID、租户ID、客户端密钥参数构建机密客户端实例 IConfidentialClientApplication cca = ConfidentialClientApplicationBuilder .Create(c_Id) .WithTenantId(t_Id) .WithClientSecret(clientSecret) .Build(); // 调整令牌请求范围为当前租户的SharePoint资源,替换为实际租户域名 string[] sharePointScopes = new[] { $"https://{yourTenantDomain}.sharepoint.com/.default" }; var authResult = await cca.AcquireTokenForClient(sharePointScopes).ExecuteAsync();
核心REST调用实现
要获取全租户维度的网站集及关联分类属性,需要调用SharePoint管理中心站点下的搜索REST端点(直接调用普通站点的_api/web/webs接口仅能获取当前站点的子级站点,无法跨租户拉取全量站点),核心调用逻辑如下:
var httpClient = new HttpClient(); // 配置认证头与请求返回格式 httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", authResult.AccessToken); httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); // 构造请求地址,筛选全租户下的所有SharePoint站点,指定返回分类相关属性 var requestUrl = $"https://{yourTenantDomain}-admin.sharepoint.com/_api/search/query?" + "querytext='contentclass:STS_Site'&" + "selectproperties='Title,Path,SiteClassification,SiteComplianceTag,SiteDescription'&" + "rowlimit=500"; // 发起请求并读取响应 var response = await httpClient.GetAsync(requestUrl); response.EnsureSuccessStatusCode(); var responseContent = await response.Content.ReadAsStringAsync();
返回字段说明
Title:站点显示名称Path:站点完整访问URLSiteClassification:站点绑定的租户自定义分类标签SiteComplianceTag:站点关联的敏感度/合规标签SiteDescription:站点基础描述信息
落地注意事项
- 全量分页处理:如果租户下站点总数超过单页返回上限,需要配合
startrow参数循环拉取(例如第一页startrow=0,第二页startrow=500),直到返回结果数小于单页配置的rowlimit值,避免数据截断 - 自定义分类适配:如果租户对站点分类做了自定义托管属性配置,需要将
selectproperties中的属性名替换为实际配置的托管属性名,否则无法正确读取对应分类值 - 权限校验:如果请求返回403错误,优先检查应用是否完成了应用级权限的管理员同意,确认应用身份没有被SharePoint的租户访问策略拦截
内容的提问来源于stack exchange,提问作者Nithish Kumar
相关产品推荐
相关产品推荐

