使用CSOM

时间:2018-10-08 17:39:28

标签: 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);
}

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

作为进一步的说明,我已经研究了仅应用程序的身份,但是由于它们在管理分类法(即术语库中的托管元数据)和管理文件(尽管如此)方面存在限制,因此我无法使用这些身份可能只是对使用CSOM的限制,this page尚不明确我

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

编辑:看起来LegacyAuthProtocolsEnabled设置为False时,基于this page,我完全不能使用SharePointOnlineCredentials类。鉴于此,看来我需要一种不同的方法来获得这种访问权限!

3 个答案:

答案 0 :(得分:1)

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

然后要向SPO进行身份验证,我们使用SharePoint PnP Core库的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 env。基本上,这会提示您在浏览器窗口中输入您的详细信息。

答案 1 :(得分:1)

您所描述的守护程序场景可以使用Azure应用通过JWT令牌进行身份验证和获取权限来实现。有关演练,请参见https://azure.microsoft.com/en-us/resources/samples/active-directory-dotnet-native-headless/

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

我也不再建议CSOM用于任何新的开发,尤其是对于SP Online,因为我相信Microsoft(或多或少公开地)淘汰此API。按照Gautam的建议使用PnP库,该库一直保持最新状态,是REST API和Managed Metadate等的很好的包装。

答案 2 :(得分:0)

对Sharepoint Online的身份验证

尝试此代码

 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;
            }
  

希望我的代码对您有帮助