在SharePoint中,正常情况下我们在WebPart或后台自定义应用程序中的代码都是以当前用户的身份和权限运行。在绝大多数情况下,这样做是正确的,也是我们期望的。
在SharePoint中,正常情况下我们在WebPart或后台自定义应用程序中的代码都是以当前用户的身份和权限运行。在绝大多数情况下,这样做是正确的,也是我们期望的。这可以阻止一般用户执行一些本来是站点管理员才能执行的操作,或者查看到不应该看到的信息。然而,有时我们的代码必须要执行一些SharePoint对象模型中对某些用户有限制的方法,即使该请求是由一个没有该操作权限的人发起的。这时,我们必须能够在代码中提升权限,使得该操作被允许在Web服务器上执行。
假设我们有一个WebPart要显示一些通过SharePoint对象模型得到的信息,如:当前站点集所有者的名称,使用率统计数据,或审核信息等。调用这些对象模型都是需要站点管理权限才可以。如果当前用户不是站点管理员的话,该WebPart试图获取这类信息时就就会报一个拒绝访问的错误。实际上,我们可以通过调用SPSecurity类的RunWithElevatedPrivileges方法成功的执行上面提到的这些调用。
SPSite siteColl = SPContext.Current.Site;
SPWeb site = SPContext.Current.Web;
SPSecurity.RunWithElevatedPrivileges(delegate() {
using (SPSite ElevatedsiteColl = new SPSite(siteColl.ID)) {
using (SPWeb ElevatedSite = ElevatedsiteColl.OpenWeb(site.ID)) {
string SiteCollectionOwner = ElevatedsiteColl.Owner.Name;
string Visits = ElevatedsiteColl.Usage.Visits.ToString();
string RootAuditEntries =
ElevatedSite.RootFolder.Audit.GetEntries().Count.ToString();
}
}
});
RunWithElevatedPrivileges方法通过接受一个委托(delegate)参数, 来添加一个需权限提升后执行的方法的引用。在C#中,正如上面的代码展示的那样,可以使用一个匿名方法来编写委托参数,直接写在另一个方法内部就行。
当我们通过调用RunWithElevatedPrivileges提升在SharePoint上下文中的权限后,我们必须接着创建一个SPSite和SPWeb类的实例。切记不能通过Microsoft.SharePoint.SPContext.Current属性来获取这些对象。因为这些对象都是通过当前用户的安全上下文创建的。上面的代码展示了一种很好的方法来在权限提升后得到这些对象。另外这样写还可以保证在Using语句外这些对象可以通过调用Dispose方法很好的被释放。
最后,我们要注意,这种方式获取的权限是很强大的。事实上,提升后的操作是在SharePoint系统帐户下运行。该帐户对于当前服务器场内所有网站集都具有完全控制的权限。因此,在使用提升权限时我们有义务保证不能让用户访问到不该访问的信息或执行一些其本来没有权限执行的操作。