欢迎来到千学网!
您现在的位置:首页 > 实用文 > 其他范文

使用SharePoint 进行安全性编程

时间:2022-08-10 22:33:37 其他范文 收藏本文 下载本文

下面小编为大家整理了使用SharePoint 进行安全性编程,本文共7篇,欢迎阅读与借鉴!

使用SharePoint 进行安全性编程

篇1:使用SharePoint 进行安全性编程

您可能已经对 使用 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(@“LITWAREINCAllFTE”) ){

// 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 的高级设计有意将每个网站集隔离开来,以便一个网站 集中的用户安全设置不会影响到其他网站集中的权限或访问控制策略。

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 的用户(登录名 LITWAREINCBrianC)从未被显式授予访 问某个网站和查看特定列表的权限。但他也许仍可以查看列表,因为他所属的 Active Directory 组已被 配置了列表查看权限。当 Brian 首次访问网站或其中任一对象(比如,使用隐式权限查看一个列表)时 ,他会被添加为 AllUsers 集合的成员,但不会被添加为 Users 集合的成员。

SiteUsers 集合是包含了当前网站集中每个 AllUsers 集合的成员的一个聚合。该集合的成员包括所 有已分配了对网站集中所有对象的访问权限的外部主体,以及所有已被授予使用隐式权限访问网站集中所 有对象的权限的外部用户。

添加已通过身份验证的用户和外部用户

那么,如何为使用 Active Directory 帐户通过身份验证的用户创建新的 WSS 用户配置文件?如果您 需要创建一个自定义用户界面组件,让标准用户或网站集所有者能够从 Active Directory 域中选择用户 或组,您确实应该了解一下 PeoplePicker 控件的用法(参见图 1)。这是 WSS 附带的一个便捷、可重 用的控件类型。您可以使用如下的控件标记将此控件添加到自定义应用程序页或 User 控件:

图 1PeoplePicker 控件

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(@“LITWAREINCBrianC”,

“brianc@litwareinc.com”,

“Brian Cox”,

“Notes about Brian Cox”);

site.SiteUsers.Add(@“LITWAREINCAllFTE”,

“allFTE@litwareinc.com”,

“All Full-time Employees”,

“Notes about FTE DL”);

尽管这种方法确实能够在“用户信息列表”中为外部主体创建配置文件,但由于无法分配权限,因此 对安全性几乎没有作用。相比之下,添加新的外部安全主体的一个更好的方式是要对权限进行分配,以便 用户有权访问当前网站。但首先您需要学习如何创建和分配权限级别。

使用权限级别

权限级别是在网站范围内定义的权限命名集。WSS 内建了四个权限级别:Read(读取)、Contribute (参与讨论)、Design(设计)和 Full Access(完全访问)。如果需要在级别设置上更为精细,可以使 用 WSS 对象模型或通过网站集所有者能够访问的标准 WSS 管理页,创建属于自己的自定义权限级别。

权限级别有时称为角色,在 WSS 对象模型中通常使用 SPRoleDefinition 对象表示这些权限级别。您 可以使用 SPRoleAssignment 对象为外部用户或组分配权限级别。例如,此处我将内置的 Contribute 权 限级别分配给登录名为 LITWAREINCBrianC 的 Windows 用户:

SPWeb site = SPContext.Current.Web;

SPRoleDefinition role = site.RoleDefinitions[“Contribute”];

SPRoleAssignment roleAssignment;

roleAssignment = new SPRoleAssignment(@“LITWAREINCBrianC”,

“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 权限级别的示例。

Figure2创建一个新的 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[@“LITWAREINCBrianC”];

SPUser user2 = site.SiteUsers[@“LITWAREINCAllFTE”];

group.AddUser(user1);

group.AddUser(user2);

标识、提升和模拟

WSS Web 应用程序的工作进程是通过 IIS 应用程序池进行控制的。Web 应用程序的工作进程标识可保 证您对进程的关注,您可以通过 SharePoint 管理中心应用程序配置这些标识。您应根据域帐户(例如 LITWAREINCSP_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 标识。

现在想像这样一种情形:用户通过登录名 LITWAREINCBrianC 使用 Windows 帐户进行身份验证。调 用 RunWithElevatedPrivileges 会将 WSS 用户标识提升为 SHAREPOINTSystem 帐户。 SHAREPOINTSystem 帐户内置于 WSS 运行库,在 WSS 授权模型中拥有完全的权限。调用 RunWithElevatedPrivileges 还将切换执行代码的 Windows 标识,从而该代码以当前 Web 应用程序的工 作进程标识运行:

// BEFORE ELEVATION

// WSS User identity = LITWAREINCBrianC

// Windows identity = LITWAREINCBrianC

SPSecurity.RunWithElevatedPrivileges(delegate() {

// AFTER ELEVATION

// WSS User identity = SHAREPOINTSystem

// Windows identity = LITWAREINCSP_WorkerProcess

});

在某些情景中,您可能会选择在尝试访问 Windows 文件系统或 SQL Server 数据库中的文件之前调用 RunWithElevatedPrivileges 方法,以便更改当前调用的 Windows 标识。另请注意,如果您从 Windows 标识切换到进程标识(例如 LITWAREINCSP_WorkerProcess),则可以不必在 Active Directory 环境下 对委托进行配置。当您的自定义 Web 部件能够使用 Windows 集成身份验证访问远程 SQL Server 数据库 中的数据时,这项功能会非常有价值。

另外还会出现其他情景,您可能需要通过调用 RunWithElevatedPrivileges 方法将 WSS 用户标识提 升为 SHAREPOINTSystem,以便您的代码能够执行在当前用户权限下不允许的操作。一旦代码能够以 SHAREPOINTSystem 身份运行,您就可以在 WSS 授权子系统中几乎随心所欲地执行任意操作。

调用 RunWithElevatedPrivileges 提升为 SHAREPOINTSystem 帐户也有其相对棘手的一方面。例如,设想您 调用 RunWithElevatedPrivileges,然后尝试通过 SPContext.Current 属性访问当前网站集或网站中的 对象。您也许想不到代码会出错,但事实可能出乎您的意料:

SPSecurity.RunWithElevatedPrivileges(delegate() {

SPSite siteCollection = SPContext.Current.Site;

// next line fails if current user is Contributor

string siteCollectionOwner = siteCollection.Owner;

});

为什么将 WSS 用户标识提升为 SHAREPOINTSystem 之后本示例代码会执行失败?这 与 SPSite 对象的创建时间有关。SPSite 对象及其子对象 SPWeb 的权限实际上并不依赖于当前 WSS 用 户标识。而是依赖于创建 SPSite 对象时的 WSS 用户标识。在这里,由于可通过 SPContext.Current 进 行访问的 SPSite 对象是在之前的请求中创建的,在该对象创建时,您的代码还无法切换其 WSS 用户标 识。

因此,您需要使用一点技巧,在调用 RunWithElevatedPrivileges 并将 WSS 用户标识提升为 SHAREPOINTSystem 之后,创建一个新的 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 SHAREPOINTSystem

}

}

});

这样就可以 打开网站集及其中的网站,以便您的代码能以 SHAREPOINTSystem 身份访问对象。

您可能还发现有必要模拟特定的 WSS 用户标识。这种方式在为事件处理程序或自定义工作流模板编写 代码时(这种情况下代码默认以 SHAREPOINTSystem 身份运行)非常常见。例如,您可能希望在创建新 对象之前模拟特定 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[@“LITWAREINCBrianC”];

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 用户 之前一个请求以 LITWAREINCSP_WorkerProcess 的 Windows 标识身份运行,则代码将以同一 Windows 标识身份继续运行。WSS 用户模拟不会将当前 Windows 标识更改为被模拟用户的标识。

同样需要注意的是,代码要模拟另一个用户,必须在特权状态下运行。但在事件处理程序或自定义工 作流模板中无需担心这一问题,因为在这类情况下代码默认以 SHAREPOINTSystem 身份运行。但是,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[@“LITWAREINCAllFTE”];

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.

在线代码:

msdn.microsoft.com/zh-cn/magazine/cc164224.aspx

篇2:Sharepoint中使用Silverlight的相关问题

Silverlight越来越多的应用到了Web开发环境,在Sharepoint中也不例外,下面是一些关于在Sharepoint 中使用Silverlight的备注事项:

1、IE版本问题:Silverlight的xap文件在64bit的IE里是不能加载的,因此,请用32bit的IE进行加载,

2、Safari浏览器支持问题:Silverlight WebPart不支持Mac机上的Safari浏览器,但在Pc机上的Safari浏览器能加载。

3、Xap文件调用路径问题: 在Sharepoint开发代码中调用xap文件时要使用xap文件的相对路径(Relative Path),因为你某天把现在的Web application扩展到其它区域时,你会使用不同的url来访问你的web,如果你使用的是full path,你的Silverlight WebPart就必然会因为url的改变而加载失败,

4、Xap文件部署位置问题: 至于如何部署你的xap文件,常见的有两种选择,一种是在你的Sharepoint网站上创建一个Document Library,然后在那儿存放你的xap文件。另一种是部署到“layouts”的“ClientBin”目录下,此方法的好处是便于在VS2010环境中对此位置进行操作。

5、WCF与Silverlight结合问题: 在WCF proxy generation与Silverlight的结合时会出现当升级了WCF service后,想进一步升级Silverlight 项目中对此WCF service的引用(reference),而此时你会发现proxy generation失败,项目里也无法创建proxy classes。试着通过reflecting你的Sharepoint网站里已经部署好的WCF service并修改web.config的有关设置来解决此问题。

篇3:VB编程:使用枚举的情况

VB编程:使用枚举的情况

在可能的情况下使用枚举

枚举的格式为

[Public | Private] Enum name

membername [= constantexpression]

membername [= constantexpression]

....

End Enum

Enum 语句包含下面部分:

部分 描述

Public 可选的,表示该 Enum 类型在整个工程中都是可见的。Enum 类型的缺省情况是 Public。

Private 可选的。表示该 Enum 类型只在所声明的模块中是可见的。

name 必需的`。该 Enum 类型的名称。name 必须是一个合法的 Visual Basic 标识符,在定义该 Enum 类型的变量或参数时用该名称来指定类型。

membername 必需的。用于指定该 Enum 类型的组成元素名称的合法 Visual Basic 标识符。

constantexpression 可选的。元素的值(为 Long 类型)。可以是别的 Enum 类型。如果没有指定 constantexpression,则所赋给的值或者是 0(如果该元素是第一个 membername),或者比其直接前驱的值大 1。

说明

所谓枚举变量,就是指用 Enum 类型定义的变量。变量和参数都可以定义为 Enum 类型。Enum 类型中的元素被初始化为 Enum 语句中指定的常数值。所赋给的值可以包括正数和负数,且在运行时不能改变。例如:

Enum SecurityLevel IllegalEntry = -1 SecurityLevel1 = 0 SecurityLevel2 = 1 End Enum

Enum 语句只能在模块级别中出现,

定义 Enum 类型后,就可以用它来定义变量,参数或返回该类型的过程。不能用模块名来限定 Enum 类型。类模块中的 Public Enum 类型并不是该类的成员;只不过它们也被写入到类型库中。在标准模块中定义的 Enum 类型则不写到类型库中。具有相同名字的 Public Enum 类型不能既在标准模块中定义,又在类模块中定义,因为它们共享相同的命名空间。若不同的类型库中有两个 Enum 类型的名字相同,但成员不同,则对这种类型的变量的引用,将取决于哪一个类型库具有更高的引用优先级。

不能在 With 块中使用 Enum 类型作为目标。

Enum 语句示例

下面的示例演示用 Enum 语句定义一个命名常数的集合。在本例中是一些可以选择的颜色常数用于设计数据库的数据输入窗体。

Public Enum InterfaceColors

icMistyRose = &HE1E4FF&

icSlateGray = &H908070&

icDodgerBlue = &HFF901E&

icDeepSkyBlue = &HFFBF00&

icSpringGreen = &H7FFF00&

icForestGreen = &H228B22&

icGoldenrod = &H20A5DA&

icFirebrick = &H2222B2&

End Enum

好处是加快编程速度

篇4:使用旺季进行造句

使用旺季进行造句

1. 夏天是西瓜旺季。

2. 结婚旺季就要来了。

3. 旅游旺季在度假小屋住一周通常需花费约70英镑。

4. 在旺季你可以以每周300英镑的价钱租一套俯视大海的房屋。

5. 正当旺季开始,饭馆的厨师离开了,这使店主陷入了困境。

6. 因为现在是旺季,洗衣服务比原定时间要慢一些。

7. 水果旺季优惠,请勿错过机会。

8. 冬末时节是阿尔卑胜地的旅游旺季。

9. 旺季来了,我的生意正在全力进行。

10. 此外,这一天又恰好是北半球的旅游高峰旺季刚过去,南半球的旅游季节又到来的时候。

11. 今年的市场旺季已经到来,我国广大农村市场出现了进一步繁荣昌盛的势头。

12. 特别是现在,正值春季中国出口商品交易会期间,又是旅游旺季,到广州市的内、外宾大量增加,该市接待任务繁重、住房紧张,交通拥挤。

13. 商品需要有旺季和淡季之分,这在农村市场上尤为明显。

14. 其他地区的销售商也报告这个销售旺季有了个良好的开端。

15. 对学法律的学生来说,秋季是招聘旺季。

16. 每当临近漆树的生长旺季,其树叶在经历了风吹雨打之后色彩显得更为明亮。

17. 他们在旺季去欧洲旅行。

18. 在旺季,工作量有可能会超过我们的极限。

19. 任何一个旅游景点都有淡季和旺季之分。

20. 在旺季,这个海滩每日都会被一位安理会承包商清理。

21. 市场需求暖和增长,但旺季特征并不明显。

22. 煤炭市场正迎来旺季的需求拉动。

23. 作为一年中的消费旺季,圣诞期间更因该加强环保意识。

24. 尽管是蔬菜旺季,菜价仍然很贵。

25. 因为现在是旅游旺季,空中交通壅塞,我们可能要到九点才降落。

26. 我们在旅游旺季总是安排得满满的。

27. 每到旺季商贩云集,车流涌动,繁荣之势如同春潮。

28. 我们希望货物能赶在圣诞节销售旺季时抵达。

29. 现在本应是巴厘岛最繁忙的旅游旺季。

30. 因为现在是旺季,我们公司的生产期已经排的很满。

31. 下个月是我们的旺季。

32. 我们工厂的`生产旺季是从每年的8月到次年的2月。

33. 现在正是旺季。

34. 另一种防止旺季农产品过剩的服务是提供消费市场的情报。

35. 在度假旺季,旅馆经常客满。

36. 旅游企业尝试保持业务的另一方式是,推出比之前提前时间早许多的提前预订折扣,包括了夏秋旅游旺季折扣价格。

37. 假期旺季即将到来,这不是很有利的消息。

38. 虽然时值飓风旺季,但大西洋却一直保持平静。

39. 周二公布的数据显示,春季销售旺季的展开协助提振房价。

40. 目前正值印度的结婚旺季,这通常是市场大量需要黄金礼品的时候,而中国消费者正在为下周开始的“十一”黄金周假日做购物准备。

41. “网购星期一”,创造这一词汇的一贸易组织-全国零售商联合会在用此来描述星期一后的感恩节,是非官方的最为繁忙的网上零售旺季的开始。

42. 但艺电缺少能与《使命召唤》这种重磅产品匹敌的射击类游戏,在今年假日旺季需要凭借《战地3》的热销从该市场抢占一片领地。

43. 随着今年的结婚旺季临近,你会发现邮箱收到的婚礼邀请函变少了。

44. 苏格兰皇家银行的经济学家本·辛普梵德夫说,出口上升是美国零售商恢复的一个信号,欧洲已经为假期采购旺季储备了大量的存货。

45. 正如今年的这个休假旺季,相之与以前,如今我这个大家庭的成员,因为各种或悲或喜的原因而散落各处。

46. 我不愿陷入钓鱼的习惯,而钓鱼是有它的旺季和淡季的。

47. 大多数饭店在旺季房价过高。

48. 旅游旺季结束以来,饭店客房预订率呈下降趋势。

49. 我们得准备好那商品以备圣诞节销售旺季。

50. 旅游旺季结束以来,饭店客房预订率幅下降趋势。

51. 草莓现在已过旺季。

52. 这是商业旺季,外省人和外国人将云集巴黎。

53. 一年中的销售旺季是什么时候?

54. 交通繁忙和旺季时会等很长的时间。

55. 旅游旺季时价格会提高。

56. 到斯里兰卡旅游的旺季是从12月到3月。

57. 在旺季旅行可能是个麻烦。

58. 旅游旺季时,旅馆的房费很贵。

59. 在旅游旺季,旅馆通常提高收费。

60. 到了旺季,他们每天都杀1000只

61. 它预示了新的戏剧旺季的来临。

篇5:使用总是进行造句

使用总是进行造句

1、生活中总是有一些不开心的事,我们要笑着面对。

2、不论你身居何处,我总是给你打电话嘱咐,总是给你发信息鼓励。

3、不管天气多么炎热,不管生活条件多么艰苦,小明总是在很用功地学习!

4、每次上课他总是迟到,为此经常受到老师的批评。

5、不论多么寒冷,他总是适时出现在教室门口。

6、家人总是强迫我参加辅导班。

7、不论有多大的困难,他总是面带着微笑。

8、不论刮风下雨,不论严寒酷暑,国旗护卫队总是让五星红旗与太阳一同升起。

9、不管天气如何恶劣,他总是很早起床读书。

10、老师总是面带微笑地迎接学生。

11、勤奋的人总是会有收获的。

12、这几天总是下雨,而且常常伴随着滚滚雷声,有时候还夹杂着冰雹。

13、只要大家不随地乱扔垃圾,世界总是会有一点清新的环境的。

14、同学之间总是喜欢在各方面比来比去的'。

15、每次考试的时候,我的心总是很紧张。

16、妈妈总是逼我吃青菜。

17、他成绩很好,总是考第一名。

18、不论孩子身上弄得多么脏,母亲总是不厌其烦地帮他清洗干净。

19、无论我怎么说,他总是要走的。

20、无论考试成绩是好是坏,我总是保持乐观向上的心态。

21、不管那风雨吹.不管那太阳晒.我总是背着那书包上学堂。

22、无论她怎么调皮,老师总是很耐心的教导他。

篇6:使用无缘无故进行造句

使用无缘无故进行造句

1、爸爸的手机不知道怎么无缘无故的坏掉了。

2、爸爸今天一大早竟然无缘无故地把睡梦中的我叫醒了。

3、爸爸有时会无缘无故地发脾气,大概是最近在工作上又有不顺心的事吧,我们要宽容。

4、不过,那天夜里对我来说是有点麻烦,老睡不熟,无缘无故的隔一段时间就醒来一次。

5、不知为什么,表弟忽然无缘无故地哭起来了,无论我怎样哄都不听。

6、楚楚总是无缘无故的发脾气,拿我们当出气筒,搞得我们莫名其妙。

7、赫斯勒来到中国东南部城市丽水,参观他们的驾校学习课程,他发现在那里学生们午餐时习惯喝啤酒,喜欢无缘无故地鸣笛,此外还擅长超车。

8、今天开学了,老师无缘无故的让我们去外面玩。

9、今天学校广播室好像并没有人,喇叭里竟然突然无缘无故地想起了音乐声。

10、近年来,在美国已经发生了几起人们无缘无故受到鲨鱼攻击的事件。

11、卡尔讨厌我,他总是无缘无故地指责我。

12、然而我们从一出生就发出的信息是,如果你进不了足球队或进不了“适宜的”学校,那么你就会无缘无故以比别人更少的分数结束生命。

13、人世间,没有无缘无故地爱,也没有无缘无故地恨。

14、世上没有无缘无故的爱和恨,自然也不会有无缘无故的饭局。

15、他们也许总是无缘无故地感到无聊,丢三落四,不经思考就说或做大脑所想的一切事情,打断别人的谈话。

16、他无缘无故被人冤枉说偷了别人的东西,心里特别难受,整天闷闷不乐的样子。

17、他无缘无故的'被老师骂了一顿!

18、他无缘无故的发火了,所有人都莫名其妙。

19、他无缘无故就不理我了,真是让人困惑。

20、他总是无缘无故地刁难我,让我一头雾水,做事总是有理由的吧。

21、她近来总是无缘无故地发脾气,可能是遇到了什么烦心事吧!

22、她开始每天呕吐,无缘无故就出现头痛和眩晕,而且一连好几日都是如此。

23、我发现成绩是不会无缘无故的下降的,成绩的下降表明着我的学习方法不对,需要改正。

24、我家的乌龟不知为什么无缘无故的跑到下面了。

25、我家的小鱼无缘无故的死掉了,我难过极了。

26、我今天一到学校就无缘无故地被人指责,心里自然很不好受。

27、我妹妹睡在我旁边的床上,我哥哥睡在地板上,当时我也是半睡半醒了,突然电视无缘无故自己开了。

28、我晚上上网的时候,经常遇到无缘无故就断网的情况。

29、我无缘无故地拿着一个水壶在发呆,因为我要写关于水壶的作文,可是不知从哪里下手,所以有点莫名其妙。

30、我正一心一意地做作业,却无缘无故的睡着了,也许是因为太累了吧。

31、无论如何,在某个时刻,母亲确实开了门,无缘无故地开了门。

32、现在的他避免无缘无故冒犯他人,在人们耳旁说悄悄话时会挡住自己的嘴。

33、小明无缘无故的发起脾气。

34、小明无缘无故的拍了一下桌子,坐在旁边的小妹妹吓死了。

35、研究人员称“反向驾驶浪潮”能够解释为何交通阻塞有时候似乎好像无缘无故的出现。

36、一大早就无缘无故被人责骂,他整天都心情不高兴,感觉受了莫大的委屈。

37、一位男士表示,如果有人无缘无故地对他笑,他会想去扁他。

38、银行不会无缘无故地变得不安全,除非所有人都认为它不安全。

39、在回家的路上,无缘无故的多了很多不良少年,别在路上久留。

40、在无缘无故被妈妈责罚后,小强变得垂头丧气沉默寡言了。

41、这个消息不会无缘无故地空穴来风,其中一定是发生了什么事情。

42、这会导致测试无缘无故地失败。

43、正如他们所看到的,一群法兰克野蛮人闯进来,无缘无故的袭击他们。

44、最近我们小区经常无缘无故地停电,让没有提前得到通知的居民不知道发生了什么事情。

篇7:使用简单一词进行造句

使用简单一词进行造句

1、这次考试很简单,可是由于我的粗心,只考了95。

2、做好事情要从最简单的方法入手。

3、老师出的题好简单。

4、老张主意多,魅力大,可真不简单!

5、今天的数学课上,老师竟然问我们一加一等于几这个超简单的问题,这问题里一定藏有文章。

6、你穿的衣服也太简单了吧。

7、我的.人生目标就是追求简单,简简单单才是幸福。

8、小明希望简单的过这一生。

9、小明上课认真听讲之后,原来复杂的问题都变得简单了。

10、英语老师在黑板上写了几个简单的问题。

11、简单而不繁琐的解题思路对于学生学习非常重要。

12、其实这个问题很简单,它没你想的那么复杂。

13、他简单地说了几句话。

14、他屋内的摆设确实很简单,但很实用。

15、做饭并没有我所想的那么简单。

16、他不只是一个大学生那么简单。

使用神采奕奕进行造句

SharePoint 入门教程

使用电化学保护法对造纸设备进行防护

编程实习报告

UG4.0编程笔记

c语言编程心得体会

学习编程的方法

大学生编程实习总结

数控编程就业前景

趣味编程小学作文

《使用SharePoint 进行安全性编程(精选7篇).doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式

点击下载本文文档