使用 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;
}
我觉得我在这里遗漏了什么。我正在尝试通过 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;
}