在編寫WebPart或EventHandler時,當前登入網站的是一個只具有普通許可權如查看而沒有編輯添加許可權的使用者,而在這個網站中存在一個利用當前登入網站使用者的許可權去執行向某列表或文件庫中添加新記錄的WebPart裡的代碼,但是這時當前登入的使用者並沒有相應的對列表或文件庫添加新記錄的許可權,這時就要在WebPart的代碼裡做文章了,這就是我要提到的類比提升目前使用者的許可權以更高的許可權來運行代碼。
在MOSS代碼中用來提升許可權,類比成網站管理員的許可權,在這過程需要使用者MOSS裡的物件模型裡的SPSecurity.RunWithElevatedPrivileges來進行。SPSecurity.RunWithElevatedPrivileges對象是可以將目前使用者在代碼裡的安全上下文憑據提升類比成當前網站的管理員的許可權運行此代碼。
如第一種情況:
//類比提升許可權
SPSecurity.RunWithElevatedPrivileges(delegate
{
//建立指定網站集
using (SPSite site = new SPSite("http://moss"))
{
//開啟網站
using (SPWeb web = site.OpenWeb())
{
//允許更新網站
web.AllowUnsafeUpdates = true;
//開啟所屬的文件庫
SPList list = web.Lists[ListName];
………….
web.AllowUnsafeUpdates = false;
}
}
});
這種情況下建立的SPSite對象會以全新的身份就是以網站管理員(SPSAdmin)的身份來運行下面的方法體的,而不是當前登入使用者真正在此網站裡的許可權。
如第二種情況:
//建立指定網站集
using (SPSite site = new SPSite("http://moss"))
{
//類比提升許可權
SPSecurity.RunWithElevatedPrivileges(delegate
{
//開啟網站
using (SPWeb web = site.OpenWeb())
{
//允許更新網站
web.AllowUnsafeUpdates = true;
//開啟所屬的文件庫
SPList list = web.Lists[ListName];
………….
web.AllowUnsafeUpdates = false;
}
});
}
這種情況那麼所建立的使用者安全內容相關的許可權就是以當前登入使用者在此網站中真正實際許可權來運行接下來的代碼方法體,雖然代碼中建立的SPWeb對象開啟網站是在SPSecurity.RunWithElevatedPrivileges類比許可權的方法塊中運行,但根據代碼的運行結果可以看出SPSecurity.RunWithElevatedPrivileges對象並沒有起到提升許可權的效果。
這兩種說明了在SPSecurity.RunWithElevatedPrivileges對象方法塊中建立網站SPSite對象所產生的運行效果是完全不同的。
上面談到的是用系統管理員帳號和登陸使用者去執行代碼的,當然我們也可以指定運行代碼的帳號:
如第三種情況:
SPSite siteColl = SPContext.Current.Site;
SPWeb site = SPContext.Current.Web;
SPUser user = site.Users[@“username@moss.com”];
SPUserToken userToken = user.UserToken;
SPSecurity.RunWithElevatedPrivileges(delegate() {
using (SPSite ElevatedsiteColl = new SPSite(siteColl.ID, userToken)) {
using (SPWeb ElevatedSite = ElevatedsiteColl.OpenWeb(site.ID))
{ //以litware"ken身份運行
string SiteCollectionOwner = ElevatedsiteColl.Owner.Name;
}
}
});
這種方式的話,代碼就以“username@moss.com”的許可權來運行。
引用:http://www.cnblogs.com/netcai/archive/2008/09/11/1288897.html
http://blog.csdn.net/iiboy/archive/2008/05/24/2477113.aspx