在SharePoint 2010中,模拟(Impersonation)是一种安全特性,它允许开发者控制代码执行时所使用的身份。模拟技术具有以下优势:
SharePoint2010提供了以下模拟方法:
注意:系统账户(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);
}
});