快捷搜索:

学习:SPWeb:Allusers、SiteUsers、Users和Sitegroups、

Office Space

应用 SharePoint 2007 进行安然性编程

Ted Pattison

代码下载位置: OfficeSpace2008_02.exe (209 KB)

Browse the Code Online

您可能已经对应用 Windows® 和 ASP.NET 的安然性进行安然编程的根基有所懂得,但您对 Windows SharePoint® Services 3.0 (WSS) 增添的安然保护又懂得若干呢?在本期的 Office Space 专栏中,我将重点先容 WSS 引入的一些新的安然术语和观点,并为您展现一个应用 WSS 工具模型实现安然编程的新天下。

建议您下载本专栏附带的示例项目,并按照本专栏其他部分供给的代码履行操作。该项目已设置设置设备摆设摆设为在构建历程完成之后运行一个批处置惩罚文件,该批处置惩罚文件会将所有的项目组件编译成一个 WSS 办理规划包,并在本地 WSS 办事器场中安装该包。在 建立项目并安装办理规划之后,您可以浏览随意率性网站集,并启用针对网站集的名为“Security Demo”的功能。然后您就可以经由过程“网站操作”菜单导航到自定义利用法度榜样页,这些页面经由过程一些代码演示了 WSS 安然编程技巧。

外部安然主体和 SPUser 工具

大年夜多半安然模型都是基于安然主体的。每个安然主体均表示一个用户或一个组。用户拥有帐户,并经由过程这些帐户进行身份验证。身份验证完成后,每位用户将得到一个身份标识。当用户应用 Windows 帐户进行身份验证时,您可以应用 System.Security 命名空间中的 Microsoft® .NET Framework 安然类来检索身份标识,该标识回指到特定的 Windows 帐户并容许您查看该用户的登录名:

复制代码

WindowsIdentity identity = WindowsIdentity.GetCurrent();

string WindowsLogin = identity.Name;

应用 WindowsIdentity,您可以动态地创建一个 WindowsPrincipal,该工具容许您经由过程测试查看当前用户是属于 Active Directory® 组照样本地 Windows 组,如下所示:

复制代码

WindowsIdentity identity = WindowsIdentity.GetCurrent();

WindowsPrincipal principal = new WindowsPrincipal(identity);

if( principal.IsInRole(@"LITWAREINC\AllFTE") ){

// perform operation allowed for fulltime employees

}

ASP.NET 同时支持 Windows 身份验证和基于表单的身份验证 (FBA)。ASP.NET 中的 User 工具经由过程基于 IPrincipal 接口(而非 WindowsPrincipal 类)进行建模的要领开脱了对 Windows 帐户的依附性。ASP.NET 运行库根据当前用户是应用 Windows 帐户照样应用 FBA 帐户进行身份验证,来动态创建不合类型的 IPrincipal 工具:

复制代码

IPrincipal AspUser = HttpContext.Current.User;

string AspUserName = AspUser.Identity.Name;

ASP.NET 的 User 工具还供给了应用 IsInRole 措施反省用户是否属于特殊角色的要领。对付 Windows 用户,IsInRole 措施让您能够查看当前用户是否为 Active Directory 组的成员。假如您应用的是 ASP.NET 角色供给法度榜样附带的 FBA 帐户,也可以应用 IsInRole 措施来反省是否已将 FBA 用户添加到特定的 ASP.NET 角色:

复制代码

IPrincipal AspUser = HttpContext.Current.User;

if(AspUser.IsInRole("Site Administrators") {

// perform privileged operation

}

身份验证操作会天生某种形式的回执,系统在运行时应用该回执来表示用户身份,以及对组或角色中的成员资格进行跟踪。假如用户应用 Windows 帐户进行身份验证,则身份验证的回执为 Windows 安然令牌。假如用户应用 FBA 帐户进行身份验证,则身份验证的回执为由 ASP.NET 运行库和特定身份验证供给法度榜样创建的一个 HTTP Cookie。

懂得 WSS 不支持用户身份验证这一点是十分紧张的。但 WSS 可以使用各类 ASP.NET 身份验证供给法度榜样供给的底层身份验证组件。WSS 对付网站安然保护的代价在于它能够对授权和造访节制进行设置设置设备摆设摆设。WSS 能够在网站集范围内对外部安然主体(例如,Windows 用户、FBA 用户、Windows 组和 ASP.NET 角色)进行跟踪。借助 WSS,您还可以设置设置设备摆设摆设分配给这些外部主体的权限,实际上是赋予用户造访 WSS 安然工具(例如网站、列表、项和文档)的权限。

请留意,网站集在设置设置设备摆设摆设授权和造访节制时发挥了极其紧张的感化。在跟踪外部主体和设置设置设备摆设摆设权限时,WSS 将每个网站集视为其彼此自力的孤岛。WSS 的高档设计故意将每个网站集隔脱离来,以便一个网站集中的用户安然设置不会影响到其他网站集中的权限或造访节制策略。

1、SPUser

WSS 工具模型应用 SPUser 工具来表示外部安然主体。您可以经由过程当前的 SPWeb 工具检索当前用户的 SPUser 工具:

复制代码

SPWeb site = SPContext.Current.Web;

SPUser user = site.CurrentUser;

string DisplayName = user.Name;

string Login = user.LoginName;

string EMail = user.Email;

string User Notes = user.Notes;

SPUser 工具公开了外部安然主体的各类属性,例如,登录名、显示名称和电子邮件地址。将外部主体添加到网站时,平日可以从底层用户存储库(例如 Active Directory 域)中检索到这些属性。SPUser 工具还供给了用于跟踪特定于 WSS 的元数据的属性,例如“注释”字段。

WSS 将外部用户、组和角色的设置设置设备摆设摆设文件数据保留在暗藏列表(称为“用户信息列表”)中。WSS 每次供给新的网站集时,会在重要站点中自动创建“用户信息列表”作为暗藏列表。然后,当首次为主体分配权限时,或主体首次经由过程安然反省造访安然工具时,WSS 会为每个外部主体添加一个新的设置设置设备摆设摆设文件。请留意,“用户信息列表”中存储的用户设置设置设备摆设摆设文件不能跨网站集进行扩展 - 用户更新一个网站集中的设置设置设备摆设摆设文件设置后,不会对其他网站集中该用户的设置设置设备摆设摆设文件设置造成变动。

另一个易肴杂的地便利是 SPUser 工具平日并不老是代体实际用户。SPUser 工具也可以代表 Active Directory 组和 ASP.NET 角色。WSS 不仅跟踪“用户信息列表”中每种外部主体的设置设置设备摆设摆设文件,而且还跟踪外部用户的设置设置设备摆设摆设文件数据。

SharePoint 安然模型的许多编程方面的内容都是经由过程 SPWeb 工具在网站级别公开。假如您要查看哪些用户是当前网站的成员,就会发明这一点。一个 SPWeb 工具可公开三种不合的用户聚拢,如以下代码段所示:

复制代码

SPWeb site = SPContext.Current.Web;

SPUserCollection c1 = site.Users;

SPUserCollection c2 = site.AllUsers;

SPUserCollection c3 = site.SiteUsers;

Users 聚拢是三个聚拢中包孕成员起码的聚拢。该聚拢包孕了当前网站中所有已显式分配了权限的外部主体。

AllUsers 聚拢包括 Users 聚拢中的所有成员,以及经由过程组或角色成员资格应用隐式权限造访过网站中的工具的外部用户。例如,假定名为 Brian 的用户(登录名 LITWAREINC\BrianC)从未被显式赋予造访某个网站和查看特定列表的权限。但他大概仍可以查看列表,由于他所属的 Active Directory 组已被设置设置设备摆设摆设了列表查看权限。当 Brian 首次造访网站或此中任一工具(比如,应用隐式权限查看一个列表)时,他会被添加为 AllUsers 聚拢的成员,但不会被添加为 Users 聚拢的成员。

SiteUsers 聚拢是包孕了当前网站集中每个 AllUsers 聚拢的成员的一个聚合。该聚拢的成员包括所有已分配了对网站集中所有工具的造访权限的外部主体,以及所有已被赋予应用隐式权限造访网站集中所有工具的权限的外部用户。

添加已经由过程身份验证的用户和外部用户

那么,若作甚应用 Active Directory 帐户经由过程身份验证的用户创建新的 WSS 用户设置设置设备摆设摆设文件?假如您必要创建一个自定义用户界面组件,让标准用户或网站集所有者能够从 Active Directory 域中选择用户或组,您确凿应该懂得一下 PeoplePicker 控件的用法(拜见图 1)。这是 WSS 附带的一个便捷、可重用的控件类型。您可以应用如下的控件标记将此控件添加到自定义利用法度榜样页或 User 控件:

图 1 PeoplePicker 控件 (单击该图像得到较大年夜视图)

复制代码

ID="pickerPrincipal"

AllowEmpty="false"

ValidatorEnabled="true"

MultiSelect="false"

SelectionSet="User, SecGroup, DL"

Width="280px"

runat="server"/>

在此示例中,我对 PeoplePicker 控件进行了设置设置设备摆设摆设,为 SelectSet 属性分配了 User、SecGroup 和 DL 三个值。经由过程设置设置设备摆设摆设这些 SelectSet 设置,该控件可以让用户根据 Active Directory 选择和解析用户、组或通讯组列表。

您可以经由过程编程要领造访 PeoplePicker 控件属性,以便在用户应用该控件选择一个或多个安然主体后检索基础帐户的相关登录帐户名。然后,您可以编写代码来实际将这些主体添加为网站成员并为其设置设置设备摆设摆设造访权限。

现在,我来先容若何将外部用户或组添加为网站成员。简单懂得 WSS 工具模型之后,您可能会觉得只需将外部安然主体直接添加到某个 SPUser 聚拢(例如 SiteUsers)即可:

复制代码

SPWeb site = SPContext.Current.Web;

site.SiteUsers.Add(@"LITWAREINC\BrianC",

"brianc@litwareinc.com",

"Brian Cox",

"Notes about Brian Cox");

site.SiteUsers.Add(@"LITWAREINC\AllFTE",

"allFTE@litwareinc.com",

"All Full-time Employees",

"Notes about FTE DL");

只管这种措施确凿能够在“用户信息列表”中为外部主体创建设置设置设备摆设摆设文件,但因为无法分配权限,是以对安然性险些没有感化。比拟之下,添加新的外部安然主体的一个更好的要领是要对权限进行分配,以便用户有权造访当前网站。但首先您必要进修若何创建和分配权限级别。

应用权限级别

权限级别是在网站范围内定义的权限命名集。WSS 内建了四个权限级别:Read(读取)、Contribute(介入评论争论)、Design(设计)和 Full Access(完全造访)。假如必要在级别设置上更为精细,可以应用 WSS 工具模型或经由过程网站集所有者能够造访的标准 WSS 治理页,创建属于自己的自定义权限级别。

权限级别无意偶尔称为角色,在 WSS 工具模型中平日应用 SPRoleDefinition 工具表示这些权限级别。您可以应用 SPRoleAssignment 工具为外部用户或组分配权限级别。例如,此处我将内置的 Contribute 权限级别分配给登录名为 LITWAREINC\BrianC 的 Windows 用户:

复制代码

SPWeb site = SPContext.Current.Web;

SPRoleDefinition role = site.RoleDefinitions["Contribute"];

SPRoleAssignment roleAssignment;

roleAssignment = new SPRoleAssignment(@"LITWAREINC\BrianC",

"brianc@litwareinc.com",

"Brian Cox",

"Notes about Brian Cox");

roleAssignment.RoleDefinitionBindings.Add(role);

site.RoleAssignments.Add(roleAssignment);

应用这种措施,您不必将用户添加到某一 SPUser 聚拢中,由于在网站内首次为外部用户或组分配权限时 WSS 已自动完成这一操作。您刚才看到的代码会在“用户信息列表”中创建一个用户设置设置设备摆设摆设文件(假如原本不存在),并将该用户添加为当前网站的 Users 聚拢的成员。

WSS 组

WSS 安然模型不仅将外部安然主体表示为 SPUser 工具,而且还供给了 WSS 组,以方便网站集范围内的权限设置设置设备摆设摆设。例如,您可以在网站集中为诸如 Site Members(网站成员)、Content Manager(内容治理员)和 Site Administrators(站点治理员)的特定用户角色设计一系列 WSS 组。完成此项操作之后,您只需为 WSS 组分配权限级别即可设置设置设备摆设摆设网站的安然设置,而无需将权限级别直接分配给 SPUser 工具。

创建 WSS 组显着的好处是有助于打消添加或删除新的外部用户和组时从新设置设置设备摆设摆设权限的必要。您只需创建网站时设置设置设备摆设摆设权限,即可做到一劳永逸。之后,只需向 WSS 组中添加或从此中删除外部用户和组即可。WSS 组采纳与 Active Directory 组完全相同的设计原则,二者的主要差别在于 WSS 组仅在单个网站集范围内定义和存在。

WSS 工具模型中将 WSS 组表示为 SPGroup 工具。SPWeb 工具公开两个 SPGroup 工具聚拢,分手为 Groups 和 SiteGroups。Groups 聚拢包括当前网站中所有已直接分配权限的 WSS 组,而 SiteGroups 聚拢则是 Groups 聚拢的超集,此中包括所有在当前网站集内创建的 WSS 组。

假如您盼望创建一个新的 WSS 组,您应该调用 SiteGroups 聚拢公开的 Add 措施,然后在目标网站内为新的 WSS 组分配一个或多个权限级别。图 2 所示为新建一个名为 Site Members 的 WSS 组并在当前网站内为其分配内置 Contribute 权限级其余示例。

Figure 2 创建一个新的 WSS 组

复制代码

SPWeb site = SPContext.Current.Web;

SPUser currentUser = site.CurrentUser;

// create new group

site.SiteGroups.Add("Site Members", currentUser, currentUser,

"Site Group created at " + DateTime.Now.ToString());

// assign permission level to new group

SPGroup NewGroup = site.SiteGroups["Site Members"];

SPRoleAssignment roleAssignment = new SPRoleAssignment(NewGroup);

SPRoleDefinition permLevel = site.RoleDefinitions["Contribute"];

roleAssignment.RoleDefinitionBindings.Add(permLevel);

site.RoleAssignments.Add(roleAssignment);

新的 WSS 组创建完毕后,将外部用户和组添加为成员就变得易如反掌了。由一个 SPGroup 工具供给一个 AddUser 措施,该措施吸收一个 SPUser 工具,然后您就可以添加外部用户和组了:

复制代码

SPWeb site = SPContext.Current.Web;

SPUser currentUser = site.CurrentUser;

SPGroup group = site.SiteGroups["Site Members"];

SPUser user1 = site.SiteUsers[@"LITWAREINC\BrianC"];

SPUser user2 = site.SiteUsers[@"LITWAREINC\AllFTE"];

group.AddUser(user1);

group.AddUser(user2);

标识、提升和模拟

WSS Web 利用法度榜样的事情进程是经由过程 IIS 利用法度榜样池进行节制的。Web 利用法度榜样的事情进程标识可包管您对进程的关注,您可以经由过程 SharePoint 治理中间利用法度榜样设置设置设备摆设摆设这些标识。您应根据域帐户(例如 LITWAREINC\SP_WorkerProcess)设置设置设备摆设摆设 Web 利用法度榜样的事情进程标识,而不应根据本地帐户(例如 NETWORK SERVICE)进行设置设置设备摆设摆设。

请留意,Web 利用法度榜样的事情进程标识必须是一个拥有特权的 Windows 帐户,该账户已设置设置设备摆设摆设了 SQL Server 权限,能够对一个或多个内容数据库进行读写操作。运行 SharePoint 治理中间网站的 Web 利用法度榜样的事情进程标识必须具有更多特权,由于它必要拥有对场的设置设置设备摆设摆设数据库进行读写操作的权限。

当 Web 部件或自定义利用法度榜样页的代码响利用户哀求开始履行时,该代码不会以托管 Web 利用法度榜样的事情进程标识履行。而是由 WSS 经由过程模拟将 Windows 安然高低文切换到其他 Windows 帐户。实际上,假如您查看 WSS Web 利用法度榜样的 web.config 文件,会看到以下项:

复制代码

假如是为已应用 Windows 帐户进行身份验证的用户履行哀求,则该哀求会模拟当前用户的 Windows 标识。然则,同样的措施并不适用于 FBA 用户,由于 FBA 身份验证不会创建 Windows 安然令牌,而且也没有 Windows 标识。是以,应用 FBA 身份验证的用户的哀求会模拟已经设置设置设备摆设摆设为匿名造访的 Windows 帐户的身份标识。IIS 中为此帐户默认分配的是 IUSER_MACHINENAME 帐户,但您可以(并且平日应该)从新设置设置设备摆设摆设此帐户以指向域帐户。

现在,让我们回偏激来看一看更高档其余 WSS 安然编程。WSS 安然模型平日会强制要求开拓职员对 Windows 标识和 WSS 用户标识加以区分。然则在一个哀求中,假如当前 Windows 标识和当前 WSS 用户标识都指向同一 Windows 登录名时,则上述环境可能不太显着。而在应用 FBA 的环境下,工作就会变得加倍繁杂。例如,WSS 用户标识可能指向名为 Andrew 的 FBA 用户,而基础 Windows 标识则基于 IUSER_MACHINENAME 帐户。当您的代码考试测验造访 WSS 工具时,WSS 会应用用户的 WSS 标识运行造访反省。而当您的代码考试测验造访 WSS 之外的外部工具(例如 Windows 操作系统掩护的文件)时,操作系统会应用 Windows 标识(代码正以此标识履行)运行造访反省。

无意偶尔候要履行代码,您必要应用比当前用户权限更高的权限。例如,我们可以假设这样一个情景:在处置惩罚一个仅拥有只读权限的用户的哀求时,您的代码必须向一个列表写入数据。而默认环境下,您的代码要以与当前用户相同的权限来运行。这时,您可以调用 SPSecurity 类的 RunWithElevatedPrivileges 措施,提升代码的安然高低文。请留意,调用 RunWithElevatedPrivileges 将同时提升 WSS 用户标识和 Windows 标识。

现在想像这样一种情形:用户经由过程登录名 LITWAREINC\BrianC 应用 Windows 帐户进行身份验证。调用 RunWithElevatedPrivileges 会将 WSS 用户标识提升为 SHAREPOINT\System 帐户。SHAREPOINT\System 帐户内置于 WSS 运行库,在 WSS 授权模型中拥有完全的权限。调用 RunWithElevatedPrivileges 还将切换履行代码的 Windows 标识,从而该代码以当前 Web 利用法度榜样的事情进程标识运行:

复制代码

// BEFORE ELEVATION

// WSS User identity = LITWAREINC\BrianC

// Windows identity = LITWAREINC\BrianC

SPSecurity.RunWithElevatedPrivileges(delegate() {

// AFTER ELEVATION

// WSS User identity = SHAREPOINT\System

// Windows identity = LITWAREINC\SP_WorkerProcess

});

在某些情景中,您可能会选择在考试测验造访 Windows 文件系统或 SQL Server 数据库中的文件之前调用 RunWithElevatedPrivileges 措施,以便变动当前调用的 Windows 标识。另请留意,假如您从 Windows 标识切换到进程标识(例如 LITWAREINC\SP_WorkerProcess),则可以不必在 Active Directory 情况下对委托进行设置设置设备摆设摆设。当您的自定义 Web 部件能够应用 Windows 集成身份验证造访远程 SQL Server 数据库中的数据时,这项功能会异常有代价。

别的还会呈现其他情景,您可能必要经由过程调用 RunWithElevatedPrivileges 措施将 WSS 用户标识提升为 SHAREPOINT\System,以便您的代码能够履行在当前用户权限下不容许的操作。一旦代码能够以 SHAREPOINT\System 身份运行,您就可以在 WSS 授权子系统中险些为所欲为地履行随意率性操作。

调用 RunWithElevatedPrivileges 提升为 SHAREPOINT\System 帐户也有其相对棘手的一方面。例如,设想您调用 RunWithElevatedPrivileges,然后考试测验经由过程 SPContext.Current 属性造访当前网站集或网站中的工具。您大概想不到代码会掉足,但事实可能出乎您的料想:

复制代码

SPSecurity.RunWithElevatedPrivileges(delegate() {

SPSite siteCollection = SPContext.Current.Site;

// next line fails if current user is Contributor

string siteCollectionOwner = siteCollection.Owner;

});

为什么将 WSS 用户标识提升为 SHAREPOINT\System 之后本示例代码会履行掉败?这与 SPSite 工具的创建光阴有关。SPSite 工具及其子工具 SPWeb 的权限实际上并不依附于当前 WSS 用户标识。而是依附于创建 SPSite 工具时的 WSS 用户标识。在这里,因为可经由过程 SPContext.Current 进行造访的 SPSite 工具是在之前的哀求中创建的,在该工具创建时,您的代码还无法切换其 WSS 用户标识。

是以,您必要应用一点技术,在调用 RunWithElevatedPrivileges 并将 WSS 用户标识提升为 SHAREPOINT\System 之后,创建一个新的 SPSite 工具:

复制代码

SPSecurity.RunWithElevatedPrivileges(delegate() {

using (SPSite elevatedSiteCollection = new SPSite(this.Site.ID)) {

using (SPWeb elevatedSite =

elevatedSiteCollection.OpenWeb(this.Web.ID)) {

// access elevatedSiteCollection and

//elevatedSite as SHAREPOINT\System

}

}

});

这样就可以打开网站集及此中的网站,以便您的代码能以 SHAREPOINT\System 身份造访工具。

您可能还发明有需要模拟特定的 WSS 用户标识。这种要领在为事故处置惩罚法度榜样或自定义事情流模板编写代码时(这种环境下代码默认以 SHAREPOINT\System 身份运行)非经常见。例如,您可能盼望在创建新工具之前模拟特定 WSS 用户标识,以便 WSS 用户能被辨觉得新工具的所有者。

为了模拟 WSS 用户标识,您必须先创建一个 SPUserToken 工具。您可以应用 SPUser 工具的 UserToken 属性实现这一操作。创建好 SPUserToken 工具之后,您就可以应用该工具使用 SPSite 类构造函数的重载版原先创建新的 SPSite 工具。此措施如图 3 所示。

Figure 3 模拟 WSS 用户标识

复制代码

SPWeb siteCollection = SPContext.Current.Site;

SPWeb site = SPContext.Current.Web;

// get SPUser object and acquire token

SPUser targetUser = site.SiteUsers[@"LITWAREINC\BrianC"];

SPUserToken token = targetUser.UserToken;

// create new SPSite and SPWeb object to impersonate user

using (SPSite impersonatedSiteCollection =

new SPSite(siteCollection.ID, token)) {

using (SPWeb impersonatedSite =

impersonatedSiteCollection.OpenWeb(site.ID)) {

// WSS identity switched to impersonate BrianC

// Windows identity does not change

}

}

关于应用 WSS 用户模拟,我必要指出几点紧张的留意事变。首先,模拟 WSS 用户与调用 RunWithElevatedPrivileges 不合,由于前者不会变动当前 Windows 标识。例如,假如在模拟 WSS 用户之前一个哀求以 LITWAREINC\SP_WorkerProcess 的 Windows 标识身份运行,则代码将以同一 Windows 标识身份继承运行。WSS 用户模拟不会将当前 Windows 标识变动为被模拟用户的标识。

同样必要留意的是,代码要模拟另一个用户,必须在特权状态下运行。但在事故处置惩罚法度榜样或自定义事情流模板中无需担心这一问题,由于在这类环境下代码默认以 SHAREPOINT\System 身份运行。然则,Web 部件或自定义利用法度榜样页中的代码在其有能力模拟其他 WSS 用户标识之前可能必要调用 RunWithElevatedPrivileges。

安然工具

设置设置设备摆设摆设 WSS 安然性的真正上风在于安然工具(例如网站、列表和列表项)供给的机动性。每个安然工具都可以包孕一个“造访节制列表”(ACL),这是一个二进制数据布局,WSS 在运行时会应用它来确定安然主体是否已被赋予了造访权限。默认环境下,重要网站是独一拥有 ACL 的安然工具。子工具(例如列表、列表项和子网站)都承袭其父工具的 ACL,除非它们回绝承袭并供给一个自己拥有的独一 ACL。

WSS 工具模型中包孕名为 ISecurableObject 的接口,用于在 WSS 网站集中建立安然工具模型(拜见图 4)。ISecurableObject 接口是经由过程 SPWeb 工具、SPList 工具和 SPItem 工具实现的,它为在运行时履行造访反省以及设置设置设备摆设摆设权限供给了根基。

图 4 ISecurableObject 接口 (单击该图像得到较大年夜视图)

当您动手在网站集中设置设置设备摆设摆设权限时,理解到所有网站、列表和列表项一路组成了安然工具的单一层次布局这一点是十分紧张的。默认环境下,只有重要网站包孕一个独一的 ACL,并对权限级其余分配进行了定义,规定用户必要得到哪种权限才能造访工具。所有子工具的权限都承袭自重要网站。然则,您可以为安然工具供给一套属于它自己的独一权限级别分配,从而加倍精细地设置设置设备摆设摆设造访节制。例如,应用图 5 所示的代码,您可以创建一个新文档库,并应用一组独一的权限对其进行设置设置设备摆设摆设。

Figure 5 设置设置设备摆设摆设一组独一的权限

复制代码

SPWeb site = SPContext.Current.Web;

Guid listID = site.Lists.Add("Proposals",

"Library desc",

SPListTemplateType.DocumentLibrary);

SPDocumentLibrary doclib = (SPDocumentLibrary)site.Lists[ListID];

doclib.OnQuickLaunch = true;

doclib.BreakRoleInheritance(false);

SPUser AllFteGroup = Web.SiteUsers[@"LITWAREINC\AllFTE"];

SPRoleAssignment assignAllFteGroup = new SPRoleAssignment(AllFteGroup);

SPRoleDefinition roleDesign = this.Web.RoleDefinitions["Read"];

assignAllFteGroup.RoleDefinitionBindings.Add(roleDesign);

doclib.RoleAssignments.Add(assignAllFteGroup);

doclib.Update();

此示例代码经由过程调用 BreakRoleInheritance 取消了默认的对父工具的权限承袭关系。假如您调用 BreakRoleInheritance 并传送一个 true 的参数值,安然工具最初会被设置设置设备摆设摆设一个与父工具 ACL 相同的副本 ACL。假如调用 BreakRoleInheritance 并传送一个 false 的参数值,则安然工具最初会被设置设置设备摆设摆设一个空的 ACL。也便是说,此文档库对付既不是所有者也不是网站治理员的用户不供给造访权限。

Windows SharePoint Services 3.0 新增了一项很受迎接的安然增强功能,让您可以将权限的设置设置设备摆设摆设详细到项目级别或文档级别。您可以经由过程 WSS 工具模型实现这一点,由于 SPListItem 工具也实现了 ISecurableObject 接口。

图 6 中的代码在文档库中创建了一个新文档,然后应用了一组与其父文档库不合的独一权限进行设置设置设备摆设摆设。请留意,这段代码应用了名为 WriteDocument 的对象措施,可吸收 SPDocumentLibrary 引用和文件名。该措施的实现应用 Office Open XML 文件款式创建 Word 文档,然后将其写回到文档库。WriteDocument 措施返回一个 SPFile 引用,该引用随后可用于造访与文档相关的 SPListItem,这样您就可以取消承袭关系并分配一组独一的权限。

Figure 6 设置与其父工具不合的权限

复制代码

SPWeb site = SPContext.Current.Web;

Guid listID = site.Lists.Add("Proposals",

"Library desc",

SPListTemplateType.DocumentLibrary);

SPDocumentLibrary doclib = (SPDocumentLibrary)Web.Lists[ListID];

doclib.OnQuickLaunch = true;

doclib.Update();

SPFile doc1 = WriteDocument(doclib, "Adventure Works Merger.docx");

doc1.Item.BreakRoleInheritance(false);

SPGroup group = Web.Groups["Litware Contact Managers"];

SPRoleAssignment assignContribute = new SPRoleAssignment(group);

SPRoleDefinition roleContibute = this.Web.RoleDefinitions["Contribute"];

assignContribute.RoleDefinitionBindings.Add(roleContibute);

doc1.Item.RoleAssignments.Add(assignContribute);

doc1.Item.Update();

停止语

我知道本日的评论争论轻细有些仓匆匆,只是让您对 WSS 的安然模型有一个大年夜致的懂得。我主要向您先容了 WSS 若何应用“用户信息列表”中的设置设置设备摆设摆设文件在网站集这一层上对外部安然主体进行跟踪,以及 WSS 若何应用 SPUser 工具在 WSS 工具模型中表示这些外部安然主体。此外我还演示了 WSS 若何支持 WSS 组,并先容了一些用于提升特权和模拟 WSS 用户的编程技术。在开拓用于实际事情的利用法度榜样时,这些技术能够为您供给所需的机动性和强大年夜功能。

只管 WSS 必要寄托根基组件系统来履行身份验证,但它确凿能够在授权和造访节制方面发挥应有的感化。WSS 授权模型很大年夜程度上基于一种被称为权限级别或角色的权限命名集。权限级别可以被分配给 SPUser 工具,但在实际利用中您平日应该选择将权限级别分配给 WSS 组。

请将您想向 Ted 扣问的问题和提出的意见发送至 mmoffice@microsoft.com。 mmoffice@microsoft.com.

Ted Pattison 是一名作家、培训师兼 SharePoint 领域的 MVP,现栖身在美国佛罗里达州的坦帕市。他还自己开办了公司 Ted Pattison Group (www.TedPattison.net),为专业开拓职员供给 SharePoint 高档培训。Ted 刚刚完成了《Inside Windows SharePoint Services 3.0》一书,该书由 Microsoft Press 出版。

您可能还会对下面的文章感兴趣: