如何:创建应用程序主体用户

上次修改时间: 2010年11月18日

适用范围: SharePoint Foundation 2010

本主题介绍如何创建应用程序主体,它是一个 SPUser 对象,代表访问 Microsoft SharePoint Foundation 数据的非 SharePoint 应用程序。

出于安全原因,管理员无法在 SharePoint Foundation UI 中添加应用程序主体,而只能使用代码创建应用程序主体。通常,代码位于小型控制台应用程序中,但它也可能位于自定义 PowerShell cmdlet、使用 Add-Type cmdlet 的 Windows PowerShell 命令行接口脚本或者其他任何可执行上下文中。

备注

无法反向使用户帐户变成应用程序主体的过程。SPUser.IsApplicationPrincipal 属性是只读的。这是因为应用程序主体应该仅用于 Silverlight 跨域数据访问模型,以便在其他用户登录并已打开承载 Silverlight Web 部件(该部件本身在第三方服务器上承载一个 Silverlight 应用程序)的页面时,允许第三方服务器访问 SharePoint 数据。如果应用程序主体可变成常规用户,则此类用户也许会意外地具有对 SharePoint 数据的完全访问权限,而无需先浏览到相应页面。

必须在要向其中添加应用程序主体用户的网站的父网站集管理员上下文中运行此代码。

创建应用程序主体

  1. 将对 Microsoft.SharePoint.dll 的引用添加到您的 C# 项目以及 Microsoft.SharePoint 的 using 语句中。

  2. 获取对要向其中添加应用程序主体用户的网站的引用。下面是一个示例。

    SPSite site = new SPSite("https://localhost");
    SPWeb web = site.RootWeb;
    
    Dim site As New SPSite("https://localhost")
    Dim web As SPWeb = site.RootWeb
    
  3. 通过调用 AddApplicationPrincipal(String, Boolean, Boolean) 创建用户对象。在此示例中,为该用户指定了一个包含提醒的登录名称,代表安装有一个或多个外部应用程序的外部服务器。两个 Boolean 参数可将该用户的 AllowBrowseUserInfoRequireRequestToken 属性分别设置为其建议的值。这样可以确保:

    • 应用程序不能访问用户信息,即使为其分配的权限本应允许其具有此类访问权限。

    • 应用程序根本不能访问 SharePoint Foundation Web 应用程序,除非该应用程序承载在实际用户已导航到的页面上的 Web 部件中。该应用程序的有效权限是为其分配的权限和实际用户权限的交集。

    SPUser principal = web.AddApplicationPrincipal("ContosoAppServer", false, true);
    
    Dim principal As SPUser = web.AddApplicationPrincipal("ContosoAppServer", False, True)
    
    重要注释重要信息

    传递到 AddApplicationPrincipal(String, Boolean, Boolean) 的登录名(在此示例中为"ContosoAppServer")必须是身份验证系统已知的用户(例如,Active Directory 域服务中已存在的用户)的名称,但该用户还不是网站用户。

  4. 为应用程序主体分配权限级别。在此示例中,将应用程序主体指定为参与者。

    SPRoleDefinitionBindingCollection roleDefBindCol = new SPRoleDefinitionBindingCollection();
    roleDefBindCol.Add(web.RoleDefinitions.GetByType(SPRoleType.Contributor));
    
    SPRoleAssignment roleAssign = new SPRoleAssignment(principal);
    roleAssign.ImportRoleDefinitionBindings(roleDefBindCol);
    
    web.RoleAssignments.Add(roleAssign);
    
    Dim roleDefBindCol As New SPRoleDefinitionBindingCollection()
    roleDefBindCol.Add(web.RoleDefinitions.GetByType(SPRoleType.Contributor))
    
    Dim roleAssign As New SPRoleAssignment(principal)
    roleAssign.ImportRoleDefinitionBindings(roleDefBindCol)
    
    web.RoleAssignments.Add(roleAssign)