2012-03-28 190 views
0

我有一個網站,承載許多asp.net應用程序。有些是用MVC2編寫的,有些是用MVC3編寫的,有些不是內部編寫和二進制部署的(雖然我們可以找到源代碼),還有許多是用ASP.Net 2.0 webforms編寫的。在所有這些網站中,我們使用來自登錄應用程序的單個登錄頁面。我們能做到這一點,因爲所有的應用程序共享:自定義FormsAuthenticationTicket驗證

  1. 同一個應用程序池
  2. 同一臺機器關鍵
  3. 相同的登錄cookie名

我的問題是,他們也分享了安全問題,沒有cookie欺騙保護。 我的計劃是在登錄cookie(可能位於useradata字段)中添加一些額外的信息(前兩個字節的ip,用戶代理),然後在接受cookie之前在每個請求上驗證該信息。

我的問題是,asp.net檢查窗體身份驗證票並加載用戶,我可以覆蓋此檢查一些額外的東西,然後再使用登錄。

這將是一個加號,如果我不必將此代碼添加到每個global.cs中,並且可以將它放在某個dll中並在配置文件中引用該dll。

+0

在子筆記我添加了一個自定義的SessionIDManager,看看是否會幫助,但只有我的會話ID不是我的登錄cookie幫助。 – Jeff 2012-03-28 00:12:37

+0

你可以在Global.asax中使用Application_AuthenticateRequest事件 - 一些相關的註釋可能在這裏:http://stackoverflow.com/questions/875472/authenticaterequest-event – SilverlightFox 2012-03-30 08:07:19

+1

asp.net不對cookie進行IP檢查的原因是因爲它是一個非常愚蠢的想法。用戶IP地址變化的條件太多,比如使用移動設備時(這可能會改變),或者用戶動態IP發生變化,或者有共享代理池。另外,這並不妨礙某人將cookie從防火牆後的一臺機器複製到同一防火牆後面的另一臺機器。您正試圖通過打破用戶使用該網站的能力來修復一個不太可能發生的漏洞,而且它甚至無法正常工作! – 2013-08-09 02:47:09

回答

0

除了編寫新的FormsAuthenticationModule之外,您不能覆蓋驗證,但有一種更簡單的方法。當ASP.NET管道處理請求時,在每個步驟中,都會引發一個事件,這是您可以利用ASP.NET管道進行工作的地方。

ASP.NET pipeline Authentication & Authorization steps

在你的情況,你可以在PostAuthenticateRequestHandler事件處理程序驗證您的Cookie。

HttpCookie authCookie = Context.Request.Cookies["YourFormsCookieName"]; 
if (IsValidAuthCookie(authCookie)) 
{ 
    // do some stuff 
} 
else 
{ 
    // expire cookie using FormsAuthentication.Signout() 
    // do some stuff 
} 

這是一個有用的鏈接:Forms Authentication