2011-03-23 142 views
0

我們有一個MVC 2 /實體框架應用程序,它是對現有系統的替換/重寫。它在開發過程中一直使用ASP成員資格來實現安全性,但現在我們需要替換它,以便與客戶現有的安全基礎架構兼容,部分原因是允許舊系統和新系統並排運行一段時間,並且還因爲它們已經具有流程和系統來設置客戶,我們不能取代這一點。幫助 - MVC證書安全

現有安全中心圍繞數據庫中的一個表存儲映射到客戶機的證書編號。 customerid然後用於過濾UI中發回的相關數據。

我的問題是什麼是從證書號碼到customerid最有效的方式。每個MVC控制器操作都可以從HTTPContext獲取證書編號,然後在安全表中進行查找以獲得客戶端,但在每個控制器操作上,這看起來效率不高。該系統可以有1000個併發用戶。我們認爲它應該類似於ASP.NET成員資格,其中用戶名/密碼登錄會生成一個安全令牌,然後將其放置在cookie中。相反,我們會讓證書替換用戶名/密碼登錄,但它仍然會生成安全令牌。

問題是,我們對這個系統還不夠了解,以確定如何去做,或者即使它是最好的前進方向。如果任何人都可以提供任何建議或指導我們如何實施這一點,將不勝感激。

回答

0

要麼

  1. 一旦你看它,以便它可以在登錄時將其添加到用戶會話。

  2. 它添加到窗體身份驗證票證(確保你是修補了詩人漏洞 或這可能是僞造的)

  1. 緩存在內存中的表和做你需要查找。如果您已經在使用會話,這可能會比會話效率略低一些,因爲您將鎖定兩個集合(正常會話使用情況),並且您存儲的集合必須同步。每個請求通過窗體身份驗證票證驗證

如果您選擇存儲在票信息,你可以創建一個CustomIdentity對象來存儲該客戶ID英寸

 
/// <summary> 
     /// Deserializes the forms auth cookie with our userid, companyid, etc. 
     /// </summary> 
     /// <param name="sender"> 
</param> 
     /// <param name="e"></param> 
     void Application_PostAuthenticateRequest(object sender, EventArgs e) 
     { 
      HttpCookie authCookie = HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName]; 
      if (authCookie != null) 
      { 
       string encTicket = authCookie.Value; 
       if (!String.IsNullOrEmpty(encTicket)) 
       { 
        FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(encTicket); 
        CustomIdentity id = new CustomIdentity(ticket); 
        //Assign the roles. If they aren't available, get from the session. 
        //The problem is when we use this custom principal it seems our roles arent populated. 

        GenericPrincipal principal = new GenericPrincipal(id, new string[] { "User" }); 

        HttpContext.Current.User = principal; 
       } 
      } 
     } 

後,你可以反序列化這個信息轉化爲客戶IIdentity對象,然後可以通過以下方式在整個應用程序中讀取:

 
int companyId = ((CustomIdentity)HttpContext.Current.User.Identity).CompanyId 
+0

非常好!這工作,以及我可以希望,非常感謝 – MarkB 2011-04-07 18:02:51