使用C#(.NET Framework 4.8)通过证书认证连接SharePoint Online
前提条件
- 已在Azure AD完成应用注册并配置证书,且应用拥有SharePoint Online对应权限(如
Sites.FullControl.All),权限已获得管理员同意 - 证书已导出为带私钥的
.pfx文件,或已安装至本地证书存储
方法一:使用PnP Framework(推荐,与PnP PowerShell逻辑一致)
1. 安装NuGet包
在NuGet包管理器控制台执行:Install-Package PnP.Framework
2. 示例代码
using System; using System.Security.Cryptography.X509Certificates; using PnP.Framework; namespace SPOConsoleDemo { class Program { static void Main(string[] args) { // 替换为你的实际参数 string tenantId = "你的Azure AD租户ID"; string clientId = "应用注册的客户端ID"; string siteUrl = "https://你的租户名.sharepoint.com/sites/目标站点"; string certPath = @"C:\Cert\YourCertificate.pfx"; string certPassword = "证书保护密码"; try { // 加载证书 var certificate = new X509Certificate2( certPath, certPassword, X509KeyStorageFlags.Exportable | X509KeyStorageFlags.PersistKeySet); // 创建认证上下文 using (var ctx = new AuthenticationManager().GetAzureADAppOnlyAuthenticatedContext( siteUrl, clientId, tenantId, certificate)) { // 验证连接:获取站点标题 ctx.Load(ctx.Web, web => web.Title); ctx.ExecuteQuery(); Console.WriteLine($"成功连接到站点:{ctx.Web.Title}"); // 扩展操作示例:获取站点所有列表 // ctx.Load(ctx.Web.Lists, lists => lists.Include(list => list.Title)); // ctx.ExecuteQuery(); // foreach (var list in ctx.Web.Lists) // { // Console.WriteLine($"列表:{list.Title}"); // } } } catch (Exception ex) { Console.WriteLine($"连接失败:{ex.Message}"); } Console.ReadLine(); } // 可选:从本地证书存储加载证书的方法 private static X509Certificate2 GetCertFromStore(string thumbprint) { using (var store = new X509Store(StoreName.My, StoreLocation.CurrentUser)) { store.Open(OpenFlags.ReadOnly); var certs = store.Certificates.Find(X509FindType.FindByThumbprint, thumbprint, false); if (certs.Count > 0) return certs[0]; throw new Exception($"未找到指纹为{thumbprint}的证书"); } } } }
方法二:使用原生SharePoint CSOM+MSAL
1. 安装NuGet包
Install-Package Microsoft.SharePointOnline.CSOM Install-Package Microsoft.Identity.Client
2. 示例代码
using System; using System.Security.Cryptography.X509Certificates; using Microsoft.SharePoint.Client; using Microsoft.Identity.Client; namespace SPOCSOMDemo { class Program { static void Main(string[] args) { string tenantId = "你的租户ID"; string clientId = "应用客户端ID"; string siteUrl = "https://你的租户名.sharepoint.com/sites/目标站点"; string certPath = @"C:\Cert\YourCertificate.pfx"; string certPassword = "证书密码"; // 加载证书 var cert = new X509Certificate2(certPath, certPassword, X509KeyStorageFlags.Exportable); // 构建MSAL客户端获取令牌 var msalClient = ConfidentialClientApplicationBuilder .Create(clientId) .WithTenantId(tenantId) .WithCertificate(cert) .Build(); var authResult = msalClient.AcquireTokenForClient(new[] { $"{new Uri(siteUrl).GetLeftPart(UriPartial.Authority)}/.default" }) .ExecuteAsync().GetAwaiter().GetResult(); // 初始化CSOM上下文 using (var ctx = new ClientContext(siteUrl)) { ctx.ExecutingWebRequest += (sender, e) => { e.WebRequestExecutor.RequestHeaders["Authorization"] = $"Bearer {authResult.AccessToken}"; }; // 验证连接 ctx.Load(ctx.Web, web => web.Title); ctx.ExecuteQuery(); Console.WriteLine($"站点标题:{ctx.Web.Title}"); } Console.ReadLine(); } } }
关键注意事项
- 应用注册的权限必须经过管理员同意,否则会触发权限不足错误
- 证书文件需确保程序有读取权限,使用本地证书存储比文件方式更安全
- 权限配置需匹配实际操作需求,避免过度授权
内容的提问来源于stack exchange,提问作者SKota
相关产品推荐
相关产品推荐

