SharePoint CSOM:Online 和 On-premises 版本在身份认证方面的一个小区别

陆陆续续做了10年多的 SharePoint 开发,一直对于 CSOM 这种“边缘学科”不是很感兴趣,觉得使用的很少。
因为越来越多的项目开始从服务器端直接走向 Web 前端开发,用的大多数是 JSOM 这种基于浏览器的 JS API,现在 SPFx 也出现了,CSOM 的生存空间越来越小了。
不过这两年做的项目中,居然连续 3次用到了CSOM,其中两次是开发 Web API,一次是开发控制台程序,用于计划任务。

前几天有这么一个需求: 使用 CSOM 开发一个 Provider-Hosted SharePoint Add-in,部署到 SharePoint Online环境。
其中有个功能需要做成 Web API,使用一个权限比较高的账户作为“代理”,来存取列表中的数据。

以前在 SharePoint 2016上部署 Web API 的时候,也是这种“前端 JS + Web API”的模式,当时用的是 AD 账户。
在 2016 环境中,我们用过 2种方式来控制 Web API的运行账户:

1. 在运行 Web API 的 IIS 应用程序中,配置其应用程序池(Application Pool)用指定的账户运行,保存的时候会要求你输入2次密码确认。
2. 在 web.config 中事先配置好用户名和密码,或者代码中 hard coding 也行吧 ~~ 程序在获取 Context 之后,设置它的 Credentials 属性。代码如下:
public static ClientContext GetContextBySite(string siteUrl)
{
    ClientContext context = new ClientContext(siteUrl);
    context.Credentials = new NetworkCredential("apac\\haining.chen", "Abc123456");
    //context.Credentials = new NetworkCredential("haining.chen", "Abc123456","apac.com"); // 这种方式中,第3个参数是 domain name

    return context;
}

但是这种两方式在 Online 环境下都不再可行,因为 SharePoint Online 基于 Office 365,用户身份来自AAD(Azure AD)。
其格式类似:“haining.chen@abcdcompany.com”,而不是 On-premises AD 的格式:“abcd\haining.chen”。
第一种方式中,需要修改 IIS 应用程序的 Identity 属性,但是你输入邮箱是不认的,保存的时候会提示你,指定的用户名不存在。

那么是不是用第二种方式,把代码中的账号换成邮箱格式就行了呢?

照样行不通~

因为毕竟是两种不同的账号,背后的验证机制也不同,所以我们需要新的方式:

public static ClientContext GetContextBySite(string siteUrl)
{
    string userAccount = "haining.chen@abcdcompany.com";
    string password = "Abc123456";

    SecureString securePassword = new SecureString();
    foreach (char passChar in password)
    {
        securePassword.AppendChar(passChar);
    }

    ClientContext context = new ClientContext(siteUrl);
    context.Credentials = new SharePointOnlineCredentials(userAccount, securePassword);
    return context;
}

这里用的是新种类的 Credential:SharePointOnlineCredentials,注意它要先把密码转为 SecureString 才行。

这样就可以在 SharePoint Online 环境中以指定的账户来运行了,当然要引用的 CSOM 版本也是最新的才行。

-------------------------------------
第一次发帖子,话说怎么样粘贴 Visual Studio 中的代码格式到编辑器中呢?都是纯文本的,得手动加格式。

陆陆续续做了10年多的 SharePoint 开发,一直对于 CSOM 这种“边缘学科”不是很感兴趣,觉得使用的很少。因为越来越多的项目开始从服务器端直接走向 Web 前端开发,用的大多数是 JSOM 这种基于浏览器的 JS API,现在 SPFx 也出现了,CSOM 的生存空间越来越小了。不过这两年做的项目中,居然连续 3次用到了CSOM(还都是汽车行业的客户,看来该行业确实已经被微软忽悠瘸了~~ )。其中两次是开发 Web API,一次是开发控制台程序,用于计划任务。
前几天有这么一个需求:使用 CSOM 开发一个 Provider-Hosted SharePoint Add-in,部署到 SharePoint Online环境。其中有个功能需要做成 Web API,使用一个权限比较高的账户作为“代理”,来存取列表中的数据。
以前在 SharePoint 2016上部署 Web API 的时候,也是这种“前端 JS + Web API”的模式,当时用的是 AD 账户。在 2016 环境中,我们用过 2种方式来控制 Web API的运行账户:

posted @ 2021-02-07 14:32  七猫和麻团  阅读(145)  评论(0)    收藏  举报