简介
SharePoint仅限应用(App-Only)模型是一种传统的设置方式,用于配置应用主体。这种模型虽然已经存在多年,但对于许多组织来说依然具有重要意义,尤其是在本地和在线SharePoint环境中广泛适用。在现代化迁移的背景下,它为从本地SharePoint迁移到SharePoint Online提供了便利。
具体来说,这种模型主要用于准备应用程序,使其能够顺利从本地部署转移到云端的SharePoint Online环境。这种迁移不仅可以优化资源,还能简化系统的维护和管理,实现更高效的工作流程。
在实际操作中,管理员可以通过这一模型来设置应用主体,并赋予其不同层级的权限。例如,您可以为应用主体配置租户范围内的完全控制权限,从而使其能够全面管理数据和资源。如果仅需要基础访问权限,这种方法也支持为应用主体授予读取权限,从而满足特定的业务需求。
- 旧模型的重要性:尽管被认为是传统方式,但它在许多迁移和整合场景中依然不可或缺。
- 适用范围:不仅支持SharePoint Online,同时也适用于本地版本(如2013、2016、2019以及订阅版)。
- 权限配置:灵活的权限设置使其适合不同的业务需求,无论是完全控制还是基础读取权限。

Azure ACS 停用公告
Azure ACS(Access Control Service)曾是一个重要的工具,用于管理应用与SharePoint之间的访问权限。然而,这一服务已进入停用阶段,微软宣布自2023年11月27日起,Azure ACS正式停用,并将在2026年4月2日完全停止工作。这一变化对使用该服务的组织和开发者产生了显著影响。
停用意味着Azure ACS不再接受新的功能投资,微软不会对其进行进一步的功能开发或改进。然而,停用阶段仍然保留基本支持,这让现有用户有一定的时间进行过渡和迁移。微软建议用户尽快开始规划替代方案,以确保业务流程的连续性。
为了应对这一变化,微软强烈建议用户转向更现代化、更安全的Entra ID应用权限模型。这种新模型不仅提供更高的安全性,还能更好地支持现代化的云环境和业务需求。通过采用Entra ID,组织可以确保在未来持续获得支持,并利用新的功能提升效率。
- 停用时间线:2023年11月27日服务停用,2026年4月2日完全停止工作。
- 影响范围:停用阶段仍有支持,但生命周期结束后服务将完全不可用。
- 建议替代方案:使用Entra ID应用权限模型以获得更好的安全性和功能支持。

设置具有租户权限的仅限应用主体
为了在SharePoint环境中实现应用程序的独立访问权限,可以通过设置仅限应用主体(App-Only Principal)来完成。这一过程涉及创建客户端ID和密码,并配置所需的权限范围。以下是详细的操作步骤和注意事项。
创建客户端ID和密码:首先,需要访问租户中的页面appregnew.aspx(例如:https://contoso.sharepoint.com/_layouts/15/appregnew.aspx)。在这个页面中,管理员可以按照提示生成一个唯一的客户端ID和密码。这些信息将用于后续的权限配置和应用访问。

需特别注意,一旦生成客户端ID和密码,务必妥善保存这些信息,因为它们不会再次显示。如果丢失,可能需要重新创建。
授予主体权限:完成客户端ID和密码的创建后,接下来需要在租户管理网站的appinv.aspx页面中为该应用主体配置权限。可以通过以下链接访问:https://contoso-admin.sharepoint.com/_layouts/15/appinv.aspx。进入页面后,输入之前生成的客户端ID,并查找相关的主体信息。

在权限配置中,管理员需要提供一个权限XML文档,该文档详细定义了应用的权限范围和控制权限。例如,以下XML表示授予应用对租户内容的完全控制权限:
<AppPermissionRequests AllowAppOnlyPolicy="true">
<AppPermissionRequest Scope="http://sharepoint/content/tenant" Right="FullControl" />
</AppPermissionRequests>
权限XML是整个配置过程中的核心部分,确保应用能够访问正确的资源,并拥有所需的权限。
确认与信任:配置完成后,点击“创建”按钮,系统会弹出一个权限许可对话框。管理员需要审查权限请求,并点击“信任它”来正式授予权限。

至此,应用主体的设置流程完成。通过这些步骤,您已经成功创建了一个具有租户范围权限的应用主体,为后续的操作做好了准备。
通过PnP PowerShell使用此主体
PnP PowerShell是一种强大的工具,旨在简化SharePoint的管理和操作。它不仅支持SharePoint Online,还适用于本地部署环境。通过使用PnP PowerShell,管理员可以利用仅限应用主体连接到SharePoint Online环境,并执行各种操作。
连接到SharePoint Online环境:使用Connect-PnPOnline命令是连接到SharePoint环境的关键步骤。此命令允许您通过客户端ID和密码的组合,安全地连接到租户中的目标站点。例如:
Connect-PnPOnline -Url https://contoso.sharepoint.com/sites/demo -ClientId [Your Client ID] -ClientSecret "[Your Client Secret]"
在上述示例中,Url指定目标站点的URL,ClientId和ClientSecret分别为之前创建的应用主体的客户端ID和密码。通过这种方式,您可以直接访问目标站点,并开展进一步的操作。
PnP PowerShell的优势:作为一个开放源代码的解决方案,PnP PowerShell拥有活跃的社区支持。这意味着您可以从社区中获得丰富的资源,包括示例代码、最佳实践以及使用技巧。以下是它的一些主要优势:
- 简化管理:帮助管理员快速执行常见的SharePoint任务,例如站点创建、权限配置、数据导入等。
- 跨环境支持:不仅适用于SharePoint Online,也支持本地版本的SharePoint(2013/2016/2019)。
- 社区驱动:活跃的开发者社区定期更新和维护,确保工具的可靠性和持续改进。
虽然PnP PowerShell是一个强大的工具,但需要注意的是,它并不附带微软的正式服务级别协议(SLA)。这意味着用户需要依赖社区支持来解决问题并获取帮助。

总之,PnP PowerShell结合仅限应用主体的使用,为管理员提供了一个高效而灵活的解决方案,用于管理SharePoint环境。通过学习和应用这一工具,您可以显著提升SharePoint的操作效率。
在应用程序中使用此主体
在开发过程中,您可以通过集成仅限应用主体来实现与SharePoint的安全交互。这种方法允许应用程序使用客户端ID和密码进行独立身份验证,避免依赖用户账户,从而提升安全性和灵活性。以下是实现这一功能的详细步骤。
使用PnP框架库:一种简单而高效的方式是利用PnP框架库来集成客户端ID和密码。您可以通过添加PnP框架库的NuGet包来实现,例如:
Install-Package PnP.Framework
安装完成后,开发者可以通过以下代码快速构建应用程序与SharePoint的连接:
string siteUrl = "https://contoso.sharepoint.com/sites/demo";
using (var cc = new AuthenticationManager().GetACSAppOnlyContext(siteUrl, "[Your Client ID]", "[Your Client Secret]"))
{
cc.Load(cc.Web, p => p.Title);
cc.ExecuteQuery();
Console.WriteLine(cc.Web.Title);
}
上述代码使用了PnP框架库中的AuthenticationManager类来获取上下文对象,实现了与SharePoint站点的互动。这种方式非常适合需要高效构建和管理的应用程序。
使用TokenHelper.cs类:如果您选择不使用PnP框架库,也可以直接通过TokenHelper.cs类来管理访问令牌和客户端上下文。TokenHelper.cs是一个功能强大的工具,它通过应用的配置文件来使用客户端ID和密码。这是代码示例:
using Microsoft.SharePoint.Client;
using System;
namespace AzureACSAuth
{
class Program
{
static void Main(string[] args)
{
string siteUrl = "https://contoso.sharepoint.com/sites/demo";
// Get the realm for the URL
string realm = TokenHelper.GetRealmFromTargetUrl(new Uri(siteUrl));
// Get the access token for the URL
string accessToken = TokenHelper.GetAppOnlyAccessToken(TokenHelper.SharePointPrincipal, new Uri(siteUrl).Authority, realm).AccessToken;
// Create a client context object based on the retrieved access token
using (ClientContext cc = TokenHelper.GetClientContextWithAccessToken(siteUrl, accessToken))
{
cc.Load(cc.Web, p => p.Title);
cc.ExecuteQuery();
Console.WriteLine(cc.Web.Title);
}
}
}
}
通过这种方式,您可以完全掌控对访问令牌的获取和使用,确保应用程序在运行时可以安全高效地与SharePoint交互。
保护客户端ID和密码:无论您选择使用PnP框架库还是TokenHelper.cs类,保护客户端ID和密码是至关重要的。这些凭据赋予应用程序对SharePoint环境的访问权限,具备极高的权限级别。如果泄露或滥用,可能会导致严重的安全问题。因此,建议将这些信息存储在安全的地方,例如加密的配置文件或安全凭据管理系统。
- 避免将客户端ID和密码直接硬编码到代码中。
- 使用环境变量或安全密钥管理系统来存储敏感信息。
- 定期更新和轮换密码,减少潜在风险。

通过以上步骤,您可以构建一个安全、高效的应用程序,与SharePoint环境进行无缝交互,同时确保敏感信息的安全性。