2013-02-01 44 views
5

我有2個ASP.NET MVC 3應用程序。我通過web.config使用模擬來允許我查詢Active Directory以獲取用戶的詳細信息。該應用程序使用Windows身份驗證,並且不允許匿名用戶。一個應用程序是用戶執行任務的主要應用程序。另一個允許用戶在應用程序一中設置其他用戶的樣子。模擬,活動目錄和「用戶沒有權限xxxx」問題

測試用戶越來越以下錯誤:

SQL1092N "<DOMAIN ID>" does not have the authority to perform the requested command. 

發生這種情況後,我送從我的主要應用到次級一個Web請求。爲了得到這個工作,我不得不讓這個請求模擬真正的用戶,而不是應用程序用於模擬的身份。這實際上是我發佈並回答的一個SO問題。這是在這裏:How do I call an MVC Action via a WebRequest and validate the request through Active Directory?

在代碼的最後,我呼籲:

impersonationContext.Undo(); 

正是這種Web請求發生後,該主應用程序試圖訪問數據庫,現在看來,上面的調用已經取消了應用程序的模擬,所以用戶嘗試做任何打開數據庫連接的操作都會失敗。至少,這是我的工作理論,經過一天頭一擊之後。

我的問題是,我怎樣才能讓應用程序模仿回到web.config中的用戶呢?或者,在提出我的網絡請求時,是否有辦法確保模擬上下文僅適用於該請求?

所有這一切的關鍵在於第二個應用程序有它自己的sql server數據庫。主應用程序使用DB2。我想寫一次數據庫訪問代碼,但在兩個應用程序中都使用它。目前這就是我所做的,但我依靠Web請求獲取數據的方法可能不是最好的方法。

我接受任何想法,意見,建議和/或批評。我應該如何處理這個問題?

+0

有什麼我需要澄清的?問題的方式是否妨礙了這種方式?歡迎反饋。我不介意在可能的情況下進行重新說明或澄清。 – jason

回答

1

好的......我的理論認爲,當Web請求被證明是準確的時,IPrincipal上下文發生了變化,這使得這個修復非常簡單。最好的部分是,我可以繼續使用我構建的api來創建此請求,而無需複製Sql Server實體框架部分。

我有以下調用我的API庫:

  proxyRequestResultDetails = ProxyApiWrapper.GetProxies(
       adUserInfo.AssociateId, 
       context.User); 

此代碼正在被授權篩選器屬性調用。該方法的原型看起來像

public void OnAuthorization(AuthorizationContext filterContext)  

內部,呼叫使GetProxies方法如下調用:

 public static StreamReader GetWebRequestStream(
      string url, 
      string contentType, 
      bool useDefaultCredentials, 
      IPrincipal user) 
     { 

      var impersonationContext = ((WindowsIdentity)user.Identity).Impersonate();    
      var request = WebRequest.Create(url); 

      try 
      { 
       request.ContentType = contentType; 
       //request.ImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation; 
       //request.UseDefaultCredentials = useDefaultCredentials;    
       //IWebProxy p = new WebProxy(); 
       //request.Proxy = p. 
       request.AuthenticationLevel = System.Net.Security.AuthenticationLevel.MutualAuthRequested; 
       request.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials; 
       var response = (HttpWebResponse)request.GetResponse(); 
       return new StreamReader(response.GetResponseStream()); 
      } 
      catch (Exception e) 
      { 
       impersonationContext.Undo(); 
       throw e; 
      } 
      finally 
      { 
       impersonationContext.Undo(); 
      } 

     } 

當調用方法返回時,用戶的身份不再是對的一組申請 模仿。修復很簡單:

  //Track current identity before proxy call 
      IPrincipal user = context.User; 
      proxyRequestResultDetails = ProxyApiWrapper.GetProxies(
       adUserInfo.AssociateId, 
       context.User); 

      //Undo any impersonating done in the GetProxies call 
      context.User = user;  

2行代碼解決了12個小時的頭疼。它本來會更糟。無論如何。感謝您成爲一名聽衆。我嘗試了 與鴨子的轉換,但鴨子感到困惑。