SharePoint 2010中的模拟技术

在SharePoint 2010中,模拟(Impersonation)是一种安全特性,它允许开发者控制代码执行时所使用的身份。模拟技术具有以下优势:

  • 通过低权限用户运行高权限代码
  • 以其他用户的身份记录更改

SharePoint2010中的模拟方法

SharePoint2010提供了以下模拟方法:

  • RunWithElevatedPrivileges:模拟系统账户用户
  • 在SPSite中传递用户令牌以模拟特定用户
  • 使用Windows API

注意:系统账户(SHAREPOINT\system)是SharePoint的应用池用户。如果在客户端操作系统(Windows 7 / Vista)上使用开发者安装,账户名称可能会有所不同。

这是最常用的模拟方法。

C# SPSecurity.RunWithElevatedPrivileges(() => { // 代码在这里 });

注意:在RunWithElevatedPrivileges的情况下,系统账户被用来执行活动。

SPUserToken是服务器模型,使用它来实现模拟。每个用户的令牌都可以由这个类表示。用户令牌实际上是一个字节数组。

SPUser类包含一个名为UserToken的属性。将SPUserToken实例传递到SPSite构造函数中,可以模拟特定用户。

C# new SPSite(UrlText.Text, user.UserToken);

要枚举站点的所有用户,可以使用web.Users属性。

C# web.Users

附带的源代码包含以下示例:

要为给定网站枚举用户,可以使用以下代码:

C# using (SPSite site = new SPSite(UrlText.Text)) { using (SPWeb web = site.OpenWeb()) { SPContext context = SPContext.GetContext(web); var users = context.Web.Users; // 显示到网格 usersGrid.DataSource = users.Cast().ToList(); } }

点击按钮后,可以看到以下用户列表:

请注意,使用的站点只有两个用户。

当前登录的用户是管理员。

现在可以尝试以每个用户的身份创建列表项。创建的项目将具有不同的“创建者”系统属性:

C# int count = 1; foreach (SPUser user in web.Users) { SPSite newSite = new SPSite(UrlText.Text, user.UserToken); // 模拟 SPWeb newWeb = newSite.OpenWeb(); SPListItem item = newWeb.Lists[ListName].AddItem(); item["Title"] = "Item " + count++.ToString(); item.Update(); newSite.Dispose(); newWeb.Dispose(); }

运行上述代码后,可以看到以下创建的项目:

请注意,每行的“创建者”属性都是不同的。

注意:如果上述用户中有任何用户没有写入权限,则会抛出异常。

现在可以尝试使用RunWithElevatedPrivileges块创建列表项。在这种情况下,用户被模拟为系统账户。

C# SPSecurity.RunWithElevatedPrivileges(() => { using (SPSite site = new SPSite(UrlText.Text)) { using (SPWeb web = site.OpenWeb()) { SPListItem item = web.Lists[ListName].AddItem(); item["Title"] = "Item created with RunWithElevatedPriveleges"; item.Update(); // 项目将由系统账户创建 ShowData(web); } });
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485