You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET环境下通过单点登录(SSO)以当前用户身份连接SharePoint Online时出现403 Forbidden错误的解决方法咨询

解决SharePoint Online SSO连接时的403 Forbidden错误

你的问题出在System.Net.CredentialCache.DefaultNetworkCredentials这个用法上——这个凭证对象是给本地Windows域环境用的,而SharePoint Online是基于Azure AD的云服务,根本不支持这种传统的NTLM身份验证方式,所以才会返回403禁止。

下面给你几个实用的解决方案,都是不需要硬编码用户名密码的SSO方式:

方案1:用PnP Core库(最推荐,开箱即用)

PnP Core库已经把现代身份验证的逻辑封装得非常完善了,能自动获取当前登录用户的凭证,完全不用手动处理令牌那些复杂的东西。

首先先安装NuGet包:

Install-Package PnP.Core

然后替换你的代码成这样:

using PnP.Core.Services;

var siteCollectionUrl = "https://xxx.sharepoint.com/teams/yyyy";

// 自动用当前用户的SSO凭证创建上下文
using var context = await PnPContextFactory.CreateAsync(new PnPContextOptions { SiteUrl = siteCollectionUrl });

// 获取网站标题
var web = await context.Web.GetAsync();
string tt = web.Title;

方案2:用Microsoft Graph + Azure AD身份验证(适合需要精细权限的场景)

如果你的应用需要更复杂的权限控制,或者要访问除了SharePoint之外的其他Microsoft 365服务,用Microsoft Graph是更好的选择。

先安装必要的NuGet包:

Install-Package Microsoft.Graph
Install-Package Microsoft.Identity.Client

然后参考这段代码:

using Microsoft.Graph;
using Microsoft.Identity.Client;

// 先在Azure AD注册一个桌面应用,拿到这个客户端ID
var clientId = "你的Azure AD应用客户端ID";
var siteCollectionUrl = "https://xxx.sharepoint.com/teams/yyyy";
// 根据你的需求调整权限范围
var scopes = new[] { "Sites.Read.All" };

// 用MSAL库获取当前用户的访问令牌
var publicClientApp = PublicClientApplicationBuilder
    .Create(clientId)
    .WithAuthority(AadAuthorityAudience.AzureAdMyOrg)
    .Build();

// 弹出登录窗口(如果当前未登录的话),获取令牌
var result = await publicClientApp.AcquireTokenInteractive(scopes)
    .ExecuteAsync();

// 创建Graph客户端
var graphClient = new GraphServiceClient(new DelegateAuthenticationProvider((requestMessage) =>
{
    requestMessage.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", result.AccessToken);
    return Task.CompletedTask;
}));

// 获取网站标题
var site = await graphClient.Sites.GetByPath("/teams/yyyy", "xxx.sharepoint.com").GetAsync();
string tt = site.DisplayName;

注意:这个方法需要你在Azure AD里注册一个桌面应用程序,开启交互式登录的权限。

方案3:用PnP CSOM扩展(如果你坚持用原生CSOM)

如果不想切换到PnP Core或者Graph,也可以用SharePointPnPCoreOnline库来扩展原生CSOM的身份验证能力:

先安装NuGet包:

Install-Package SharePointPnPCoreOnline

然后修改你的代码:

using Microsoft.SharePoint.Client;
using OfficeDevPnP.Core;

var siteCollectionUrl = "https://xxx.sharepoint.com/teams/yyyy";

// 自动使用当前用户的SSO凭证创建CSOM上下文
using var context = new AuthenticationManager().GetWebLoginClientContext(siteCollectionUrl);

context.Load(context.Web);
await context.ExecuteQueryAsync();
string tt = context.Web.Title;

最后几个关键提醒

  • 确认当前登录的用户确实有目标SharePoint网站的访问权限(至少是读取权限)
  • 如果是在个人电脑这类非域环境,要确保你已经登录了Microsoft 365的账户(比如Outlook、Teams),这样SSO才能自动获取到凭证
  • 别再用传统的NTLM凭证方式连接SharePoint Online了,云服务只认现代身份验证(OAuth 2.0)这一套

内容的提问来源于stack exchange,提问作者Ghislain Bruyere

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 03:39:11