在 SPS2003 中撰寫簡單的 Workflow 或是對特定權限設定的目錄進行操作時,某些情況下我們會希望不以目前網頁登入使用者的權限進行操作,使用特定使用者的權限操作有許多種方法,我曾見過 Oliver Lu 用了 WebRequest 來設定 Credentials 的方式來作到這樣的功能,只不過他說的是 Single Sign-On 的部分。

關於 Impersonate 的方式,我另外 Google 了一下其他人的作法,發現 Jay Nathan 所寫的這一個 Class 挺好用 (但是他寫的實作方法並不太好用… :p ),主要是可以用來 Impersonate 不同的使用者進行操作,且不是經過 WebRequest 來模擬使用者透過 Browser 操作,也就是說你還是可以使用原來的程式碼進行操作,在最後才綁上安全設定。

我寫了一個簡單的 Webpart 來進行測試,程式片段如下:

[csharp]protected override void RenderWebPart(HtmlTextWriter output)
{
string strOutput = “YOU ARE: ” + this.Context.User.Identity.Name.ToString() + “
”;
Impersonator i = new Impersonator(”username”,”domain”,”password”);
i.Impersonate();
strOutput += “NOW YOU ARE: ” + this.Context.User.Identity.Name.ToString() + “
”;

SPSite mySite = new SPSite(”http://SPSPortal/sites/TestSite”);
SPWeb myWeb = mySite.OpenWeb();
SPList list = myWeb.Lists[”Secure Library”];

SPQuery query = new SPQuery();
query.RowLimit = 0;
SPListItemCollection listItems = list.GetItems(query);
string[] astrReturn = new string [list.ItemCount];

foreach(SPListItem listItem in listItems)
{
strOutput += listItem[”Name”].ToString() + “
”;
}

i.Undo();
output.Write (strOutput);
}[/csharp]
這邊設定了兩個部分來顯示使用者,執行後發現兩塊顯示的使用者 id 是相同的,但是程式可以執行,也就是說 Impersonator 並未影響到 this.Context 部分,但是它在操作 SPSite 的時候,確實是以我們指定的使用者權限執行的 (Secure Library 僅限指定使用者可操作)。

如此一來,我們便可以設定一些安全性較高的文件庫,設定某個使用者可存取,然後當其他使用者想存取的時候,使用 Impersonate 的方式來進行操作。(PS. Webpart 的組件一定要在 GAC 中!!!)

下載 Impersonator 這個 Class 的 Source code:
http://www.15seconds.com/files/040512.zip

想瞭解 impersonation 的朋友,Microsoft 也有一篇文章說明了 ASP.NET 上使用的技巧:
How to implement impersonation in an ASP.NET application
http://support.microsoft.com/default.aspx?scid=kb;en-us;306158

Keywords: Sharepoint, Impersonate, Impersonator, security, permission

最後修改日期: 2005-07-30