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

使用C#获取SharePoint Online站点列表遇错误求解决方案

SharePoint Online 连接报错“用户名不匹配”的解决建议

核心问题排查与修复

  • 补全凭据赋值逻辑
    你当前代码中创建了SharePointOnlineCredentials对象,但未将其绑定到clientContext的凭据属性,这是导致认证失败的关键问题之一。修改代码:

    var credentials = new SharePointOnlineCredentials(userName, securePassword);
    // 新增这行,将凭据绑定到上下文
    clientContext.Credentials = credentials;
    
  • 验证用户名格式与有效性

    • 确保用户名是SharePoint Online认可的格式:优先使用user@tenant.onmicrosoft.com或已验证的自定义域名邮箱,避免使用本地域格式(如DOMAIN\username)
    • 直接用该账号密码登录SharePoint Online网页版,确认账号未锁定、密码未过期,且有权限访问目标站点
  • 处理多因素认证(MFA)场景
    如果账号开启了MFA,SharePointOnlineCredentials无法通过明文密码认证,可改用以下两种方案:
    方案1:交互式登录(适合桌面应用)

    using Microsoft.SharePoint.Client;
    using PnP.Framework;
    
    var authManager = new AuthenticationManager();
    // 弹出登录窗口完成MFA验证
    using (var clientContext = authManager.GetInteractiveLoginClientContext("https://your-site-url"))
    {
        // 获取所有列表名称
        var lists = clientContext.Web.Lists;
        clientContext.Load(lists, l => l.Include(list => list.Title));
        clientContext.ExecuteQuery();
        foreach (var list in lists)
        {
            Console.WriteLine(list.Title);
        }
    }
    

    方案2:应用程序权限(适合服务端无人值守场景)

    1. 在Azure AD中注册应用,授予Sites.Read.All等所需权限
    2. 使用客户端密钥认证:
    using Azure.Identity;
    using Microsoft.SharePoint.Client;
    
    var tenantId = "你的租户ID";
    var clientId = "应用注册的ClientID";
    var clientSecret = "应用注册的ClientSecret";
    var siteUrl = "https://your-site-url";
    
    var credential = new ClientSecretCredential(tenantId, clientId, clientSecret);
    using (var clientContext = new ClientContext(siteUrl))
    {
        clientContext.ExecutingWebRequest += (sender, e) =>
        {
            var accessToken = credential.GetTokenAsync(new Azure.Core.TokenRequestContext(new[] { "https://sharepoint.com/.default" })).Result.Token;
            e.WebRequestExecutor.RequestHeaders["Authorization"] = "Bearer " + accessToken;
        };
        // 获取所有列表名称
        var lists = clientContext.Web.Lists;
        clientContext.Load(lists, l => l.Include(list => list.Title));
        clientContext.ExecuteQuery();
        foreach (var list in lists)
        {
            Console.WriteLine(list.Title);
        }
    }
    
  • 清理系统凭据缓存
    系统可能缓存了无效凭据,可通过以下步骤清理:

    1. 打开控制面板 → 用户账户 → 凭据管理器
    2. 删除所有与SharePoint Online相关的Windows凭据

额外优化

  • 若你的需求是获取所有列表名称,需调整原代码逻辑:加载Lists集合并指定包含Title属性(示例代码已包含在上述方案中)
  • 增加异常捕获,便于定位具体错误:
    try
    {
        clientContext.ExecuteQuery();
    }
    catch (ClientRequestException ex)
    {
        Console.WriteLine($"请求错误详情: {ex.Message}");
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 20:05:23