Introduction
In this article we can explore the methods of Impersonation inside SharePoint 2010.
What is Impersonation?
Impersonation is the security feature that enables to control the Identity under which code is executed. Impersonation gives the following advantages:
- Run a high privilege code through a low privilege user
- Record changes in account of another user
What are the Impersonation methods in SharePoint 2010?
SharePoint 2010 provides the following methods of Impersonation:
RunWithElevatedPrivileges
to impersonate as System Account user- Passing User Token inside SPSite to impersonate as particular user
- Using Windows API
Note: System Account (SHAREPOINT\system) is the application pool user of SharePoint. If you are using Developer Installations
on client Operating Systems (Windows 7 / Vista) the account name will be different.
Now let us see how to use the above methods.
RunWithElevatedPrivileges
This is the most commonly used method to impersonate.
SPSecurity.RunWithElevatedPrivileges(() =>
{
});
Note: In the case of RunWithElevatedPrivileges
the System Account is used to perform the activity.
- Passing User Token
SPUserToken
is the server model which we use for the purpose. Each user’s token can be represented by this class. The User Token is actually a byte array.
The SPUser
class contains the property named UserToken
. Passing
a SPUserToken
instance into the SPSite
constructor impersonates the particular user.
E.g.: new SPSite(UrlText.Text, user.UserToken);
For enumerating all the users of a site the web.Users
property can be used.
E.g.: web.Users
Running the code
The attached source contains the following samples:
- Enumerate users
For enumerating users for a given website the following code can be used:
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<SPUser>().ToList<SPUser>();
}
}
On clicking the button we can see the following users as shown below:
- Please note that there are only two users for the site I use
- The current user logged in is Admin
- Create data impersonating each user
Now we can try creating list items impersonating each user. The created item will have the system property > Created By set to different users:
The following code performs the same:
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();
}
On running the code above, we can see the items created as shown below:
Please note that the Created By property is different for each row.
Note: An exception will be thrown if any of the users above does not have write permission.
- Create data using
RunWithElevatedPrivileges
Now we can try creating the list items using the RunWithElevatedPrivileges
block. In this case the user is impersonated to System Account.
The code for the same is shown below:
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);
}
}
});
We can see that the new item is created with a System Account as shown below:
References
Summary
In this article we have explored two methods of Impersonation in SharePoint 2010. The associated code contains the example we have discussed.