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

Kev*_*ope 2 c# sharepoint sharepoint-online

我觉得我在这里错过了一些东西。我正在尝试通过 C# 控制台应用程序登录到 SPO 租户,但出现错误:

无法联系网站“ https://xxx.sharepoint.com/ ”或该网站不支持 SharePoint Online 凭据。响应状态代码是“未授权”。

我知道该帐户有效,因为我可以直接从浏览器使用该帐户登录。最后,我用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);
}
Run Code Online (Sandbox Code Playgroud)

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

进一步说明,我已经研究了仅限 App 的身份,但我不相信我可以使用这些身份,因为它们对管理分类法(即术语库中的托管元数据)和管理文件(尽管这可能是一个仅对使用 CSOM 的限制,我在此页面上不清楚)

基于此,你能看出我在这里做错了什么吗?或者,如果有其他/更好的方法可以做到这一点,我也愿意!

编辑:看起来 whenLegacyAuthProtocolsEnabled设置为 False 我明确不能使用SharePointOnlineCredentials该类,基于此页面。鉴于此,看起来我需要一种不同的方法来获得此访问权限!

Gau*_*eth 8

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

为了向 SPO 进行身份验证,我们使用GetWebLoginClientContextSharePoint PnP 核心库的方法,该库可用作 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);
}
Run Code Online (Sandbox Code Playgroud)

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

  • 谢谢高塔姆,这很有帮助。不幸的是,这将作为服务器上不受监控的作业运行,而不是作为客户端应用程序运行,因此我需要一种无需任何用户交互即可以编程方式登录的方法。基于此,我正在更多地研究 PnP Core 库的其他身份验证函数,感谢您的提示! (2认同)

Raz*_*van 2

您所描述的守护进程场景可以使用 Azure 应用程序通过 JWT 令牌进行身份验证和获取权限来实现。有关演练,请参阅使用用户名和密码或 Windows 集成身份验证以非交互方式向 Azure AD 进行身份验证

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

我也不再推荐 CSOM 进行任何新开发,尤其是 SP Online,因为我相信 Microsoft 正在(或多或少公开地)停用此 API。正如 Gautam 所推荐的那样,使用 PnP 库,该库会保持最新状态,并且是 REST API 和托管元数据等的一个很好的包装器。

  • 仅供参考,Microsoft 并未退役 CSOM,而是为 .NET Standard 开发了 CSOM - https://learn.microsoft.com/sharepoint/dev/sp-add-ins/using-csom-for-dotnet-standard。 (3认同)
  • 2020 年,[PnP Sites 核心库已退役](https://github.com/pnp/PnP-Sites-Core),而 CSOM 已更新。CSOM 遵循 REST API 模型,因此它被淘汰的可能性很小。然而,PnP 库一直不稳定,经常被过度设计,并且总是在几年后被放弃。毕竟,如果模式如此有用,为什么不将其移至主库本身呢?这并不是 SharePoint 特有的 - 2005 年发布的数据访问块已于 2008 年合并到 ADO.NET 2.0 中。当 Lg4Net 出现时,日志记录块基本上被放弃了 (2认同)