使用 CSOM 对 Sharepoint Online 进行身份验证

Authentication to Sharepoint Online with CSOM

我觉得我在这里遗漏了什么。我正在尝试通过 C# 控制台应用程序登录 SPO 租户,但出现错误:

Cannot contact web site 'https://xxx.sharepoint.com/' or the web site does not support SharePoint Online credentials. The response status code is 'Unauthorized'.

我知道该帐户有效,因为我可以直接从浏览器使用该帐户登录。最后,我 喜欢 使用 CSOM 对 SP 列表、术语库和文档库执行 CRUD 操作,但 CSOM 不是硬性要求(我承认我不知道 REST API 是否可以完成全部工作)。

我看到将 LegacyAuthProtocolsEnabled 值更改为 True 可以对此有所帮助,但我们的安全人员不允许我启用该功能。

代码非常普通:

SecureString passWord = getPassword();
using (var context = new ClientContext(URI))
{
    context.Credentials = new SharePointOnlineCredentials(userName, passWord);//new NetworkCredential(userName, passWord);//
    context.Load(context.Web, web => web.Title);
    context.ExecuteQuery(); //Error happens here
    Console.WriteLine("Your site title is: " + context.Web.Title);
}

如您所见,我也尝试传递 NetworkCredentials 对象,这也不起作用(我也收到 401 响应)。

作为进一步说明,我研究了仅限应用程序的身份,但我认为我不能使用这些身份,因为它们在管理分类法(即术语库中的托管元数据)和管理文件(虽然这可能只是对使用 CSOM 的限制,但我不清楚 this page)

基于此,你能看出我这里做错了什么吗?或者,如果有 different/better 方法可以做到这一点,我也愿意接受!

EDIT:看起来当 LegacyAuthProtocolsEnabled 设置为 False 时,我明确地根本不能使用 SharePointOnlineCredentials class,基于 this page。鉴于此,看来我需要一种不同的方法来获得此访问权限!

这是一个非常常见的问题,我们在 LegacyAuthProtocolsEnabled 设置为 False 时经常遇到。当我们在租户中配置多因素身份验证 (MFA) 时,它也会影响我们。

然后,为了向 SPO 进行身份验证,我们使用 SharePoint PnP 核心库的 GetWebLoginClientContext 方法,该库作为 nuget 包提供。

所以,修改你的代码如下:

AuthenticationManager authManager = new AuthenticationManager();
using (var context = authManager.GetWebLoginClientContext(URI))
{
    context.Load(context.Web, web => web.Title);
    context.ExecuteQuery();
    Console.WriteLine("Your site title is: " + context.Web.Title);
}

在控制台应用程序中添加 SharePointPnPCoreOnline Nuget 包。之后,您将能够登录到 SPO 环境。基本上,这会提示您在浏览器中输入您的详细信息 window.

您描述的守护进程场景可以使用 Azure 应用程序通过 JWT 令牌进行身份验证和获取权限来实现。有关演练,请参阅 Authenticating to Azure AD non-interactively using a username & password or Windows Integrated Authentication

如果您之前没有使用过 Azure 应用程序,我建议您花一些时间熟悉一下。它们基本上是您创建和批准的受信任委托人,以便您的应用程序使用它们的权限来执行 SharePoint 操作。

我也不再推荐 CSOM 用于任何新的开发,尤其是 SP Online,因为我相信微软(或多或少公开地)停用了这个 API。使用 Gautam 也推荐的 PnP 库,它会保持最新并且是 REST API 和 Managed Metadate 等的一个很好的包装器

string siteUrl="your Site Url";
    string username="UserName";
    string password="Password";

    public static ClientContext CreateClientContext(string siteUrl,string username,string password)
    {
        ClientContext context = new ClientContext(siteUrl);
        var securePassword = new SecureString();
        foreach (var chr in password) securePassword.AppendChar(chr);
        context.Credentials = new SharePointOnlineCredentials(username, securePassword);
        return context;
    }