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

ASP.NET连接SharePoint Online报密码过期但实际未过期如何解决

问题原因及修复方案

该报错属于SharePoint Online身份服务返回的误导性错误,并非真的账号密码过期,核心触发原因和修复方案如下:

  • 最常见触发原因:你使用的SharePointOnlineCredentials类依赖Legacy Auth(传统用户名密码认证),微软从2023年开始逐步全量禁用所有租户的传统认证权限,旧的认证请求被拦截后会误返回密码过期提示。
  • 你当前使用的Microsoft.SharePointOnline.CSOM版本过旧(2021年发布的16.1.21213.12000),该版本原生不支持现代认证流程,也没有适配最新的SPO身份验证规则。

具体修复步骤

1. 优先采用现代认证(长期稳定方案)

放弃用户名密码的认证逻辑,改用Azure AD应用身份认证,完全规避账号密码相关的策略限制:

在Azure Portal注册应用,授予对应SharePoint站点的应用权限(如Sites.ReadWrite.All等匹配业务需求的权限),使用客户端密钥或证书进行身份认证,认证方式合规且不会被微软禁用。
适配后的代码示例(基于最新版CSOM和MSAL认证库,顺带修复了你原有代码中HttpMethod参数未生效的问题):

// 需先安装Nuget包:Microsoft.SharePointOnline.CSOM(最新正式版)、Microsoft.Identity.Client
using Microsoft.Identity.Client;
using System.Net.Http.Headers;

public static async Task<HttpResponseMessage> SendAsync(HttpMethod httpMethod, string restUrl, string clientId, string clientSecret, string tenantId, string acceptHeader)
{
    Uri endpointUri = new Uri(restUrl);
    string siteRoot = $"{endpointUri.Scheme}://{endpointUri.Host}";
    
    // 获取现代认证令牌
    var confidentialClient = ConfidentialClientApplicationBuilder
        .Create(clientId)
        .WithClientSecret(clientSecret)
        .WithAuthority($"https://login.microsoftonline.com/{tenantId}")
        .Build();
    var scopes = new[] { $"{siteRoot}/.default" };
    var authResult = await confidentialClient.AcquireTokenForClient(scopes).ExecuteAsync();

    using (var client = new HttpClient())
    {
        client.DefaultRequestHeaders.Accept.Clear();
        // 挂载Bearer令牌
        client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", authResult.AccessToken);
        if (!string.IsNullOrWhiteSpace(acceptHeader))
        {
            client.DefaultRequestHeaders.Accept.Add(MediaTypeWithQualityHeaderValue.Parse(acceptHeader));
        }
        // 按传入的HttpMethod发起请求
        var request = new HttpRequestMessage(httpMethod, endpointUri);
        return await client.SendAsync(request).ConfigureAwait(false);
    }
}

2. 临时修复方案(不推荐长期使用)

如果暂时无法替换认证逻辑,可联系租户管理员在Azure AD条件访问策略中,对该服务账号开放Legacy Auth的访问例外,同时将CSOM升级到最新正式版,可临时恢复业务可用。

3. 快速验证方法

用该服务账号手动在浏览器登录SharePoint站点,若登录正常无密码过期提示,即可100%确认是传统认证被拦截导致的误报。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 07:45:05