如何在ASP.NET Core中通过CSOM以用户身份认证调用SharePoint Online?
核心逻辑
通过ASP.NET Core中Microsoft Identity获取的用户AccessToken,直接传递给CSOM完成身份认证,实现同租户下以当前登录用户上下文操作SharePoint Online。
步骤1:配置项目依赖
确保安装以下NuGet包:
Microsoft.SharePointOnline.CSOM(选用最新稳定版)Microsoft.Identity.Web(用于ASP.NET Core的Microsoft Identity集成)
步骤2:获取当前用户的AccessToken
在控制器或服务中,通过IHttpContextAccessor获取用户的AccessToken,需指定SharePoint Online的资源标识符(租户站点根地址):
using Microsoft.Identity.Web; public class SPOOperationsService { private readonly IHttpContextAccessor _httpContextAccessor; public SPOOperationsService(IHttpContextAccessor httpContextAccessor) { _httpContextAccessor = httpContextAccessor; } public async Task<string> GetSPOSiteTitle(string siteUrl) { // 获取用户针对SPO的AccessToken var accessToken = await _httpContextAccessor.HttpContext.GetAccessTokenForUserAsync("https://your-tenant.sharepoint.com"); // 后续用该Token初始化CSOM上下文 // ... } }
步骤3:用AccessToken初始化CSOM上下文
有两种方式可以实现,根据CSOM版本选择:
方式1:使用CSOM内置的认证方法(推荐新版CSOM)
using Microsoft.SharePoint.Client; var siteUrl = "https://your-tenant.sharepoint.com/sites/your-target-site"; using (var context = new AuthenticationManager().GetAzureADAccessTokenAuthenticatedContext(siteUrl, accessToken)) { // 执行CSOM操作示例:获取站点标题 context.Load(context.Web, web => web.Title); await context.ExecuteQueryAsync(); return context.Web.Title; }
方式2:手动设置请求头(兼容旧版CSOM)
如果CSOM版本未提供内置方法,可手动添加Authorization请求头:
using Microsoft.SharePoint.Client; var siteUrl = "https://your-tenant.sharepoint.com/sites/your-target-site"; using (var context = new ClientContext(siteUrl)) { context.ExecutingWebRequest += (sender, e) => { e.WebRequestExecutor.RequestHeaders["Authorization"] = $"Bearer {accessToken}"; }; // 执行CSOM操作 context.Load(context.Web, web => web.Title); await context.ExecuteQueryAsync(); return context.Web.Title; }
步骤4:配置Azure AD应用权限
在Azure AD注册的应用中添加委派权限:
- 选择SharePoint相关权限,比如
Sites.Read.All、Sites.ReadWrite.All(根据业务需求选择) - 针对租户级权限,需完成管理员同意操作
注意事项
- 确保当前登录用户在目标SharePoint站点拥有对应的访问权限
- AccessToken有效期有限,
Microsoft.Identity.Web会自动处理Token刷新逻辑 - 仅适合同租户场景,应用与SharePoint Online需归属同一Azure AD租户
内容的提问来源于stack exchange,提问作者Liero
相关产品推荐
相关产品推荐

