2010-03-05 51 views
3

我有一個Web部件訪問SP對象模型,打包在已簽名並部署到GAC的程序集中。 web.config設置爲「完全」信任,但我的Web部件會拋出一個SecurityException。問題的代碼行:信任已設置爲完整,但Web部分仍導致SecurityException

SPSecurity.RunWithElevatedPrivileges(new SPSecurity.CodeToRunElevated(() => 
{ 
    foreach (SPGroup g in user.Groups) 
    { 
     identity += String.Format(",'{0}'", g.Name.ToLowerInvariant().Replace(@"\", @"\\")); 
    } 
})); 

看來,當RunWithElevatedPrivileges是所謂的(換言之,我委託不執行的話)拋出異常。有任何想法嗎?在這一點上,我完全不知所措。

更新:這裏的樣子之前,我把它包在RunWithElevatedPrivileges方法是什麼代碼:

public MyWebPart() 
{    
    context = new MyProject.Data.MyDataContext(ConfigurationManager.ConnectionStrings["MyDB"].ConnectionString); 
    SPUser user = SPContext.Current.Web.CurrentUser; 
    identity = String.Format("'{0}'", user.LoginName.ToLowerInvariant().Replace(@"\", @"\\")); 
    foreach (SPGroup g in user.Groups) 
    { 
     identity += String.Format(",'{0}'", g.Name.ToLowerInvariant().Replace(@"\", @"\\")); 
    }    

    identity = '[' + identity + ']'; 
} 

和異常:

System.Security.SecurityException occurred 
    Message="Request failed." 
    Source="Microsoft.SharePoint" 
    StackTrace: 
     at Microsoft.SharePoint.SPBaseCollection.System.Collections.IEnumerable.GetEnumerator() 
     at MyProject.MyWebPart..ctor() 
    InnerException: 

基於由異常助手提供的高亮,它看起來像試圖訪問SPUser.Groups屬性是問題:user.Groups

我真的很困惑的是,這個確切的代碼在兩天前工作的很好,但我還有一些其他的問題與農場,基本上不得不重建它。在把所有其他東西都重新備份後,我去了並試圖將這個Web部分添加到一個頁面中,並且這個問題本身就表現出來了。我嘗試在RunWithElevatedPrivileges包裝中包裝代碼以查看是否可以準確隔離有問題的位,但是看起來接觸SP對象模型的任何東西都會導致異常,包括RunWithElevatedPrivileges方法。

update2:我仍然不知道這是失敗的真正原因,但是當我嘗試添加Web部件時發生了這種情況。在調試器中設置斷點後,我意識到構造函數被調用兩次;這是第一次,這一切都和預期一致,但第二次是拋出異常的時候。我仍然不知道爲什麼。我發現了兩種解決方法:將違規代碼從構造函數中移出到Web部件生命週期的稍後時間點,或者註釋掉代碼以添加Web部件,然後取消註釋並重新部署。

顯然,這個「3天前工作」的原因是因爲我很久以前將我的web部件添加到頁面,然後將上面的代碼添加到構造函數中。由於網頁部分已經添加,我從來沒有看到任何問題。後來,當我最近不得不重建網站並再次將網頁部分添加到頁面時,這個問題就體現出來了。所以從技術上說,它之前沒有「工作」,我只是沒有做出讓它變得不合適的事情。

無論如何,就像我說的 - 我仍然不知道異常的真正原因,所以仍然歡迎回答這些問題。

+2

將代碼移出Web部件的構造函數幫助我解決了類似問題。感謝您更新問題。 – 2011-09-30 11:38:01

+0

任何人都知道爲什麼把它從構造器中移出來工作? – xdhmoore 2012-04-19 15:06:31

回答

2

如果您嘗試使用在RunWithElevatedPrivileges()方法之外創建的SharePoint對象,並因此仍保留其舊安全上下文,則可能會出現此問題。在你的情況下,你使用了一個沒有在RunWithElevatedPrivileges()方法中創建的SPUser對象。

要變通,你應該在委託中創建你想要使用的對象。代理外的安全ID或URL,用於重新創建對象。例如:安全SPSite對象的URL或ID並使用它在委託中再次創建它。

public void Demo() 
{ 
     string siteURL = SPContext.Current.Site.Url; 
     SPSecurity.RunWithElevatedPrivileges(delegate(){ 

      using (SPSite safeSite = new SPSite(siteURL)) 
      { 
      // place your code here ... 
      } 
     }); 
    } 

也許你可以發佈堆棧跟蹤,這樣我們可以得到更多的信息。

+0

更新了OP。 – 2010-03-05 16:59:48