我在Global.asax中使用Application_OnAuthenticateRequest將自定義主體分配給HttpContext.Current.User和System.Threading.Thread.CurrentPrincipal。
在測試中,我注意到這個代碼對單個頁面請求執行多次。通過查看HttpContext.Current.Request.Url,我確定此代碼正在爲每個JavaScript文件,Image和CSS文件的調用執行。所有這些資源都存儲在稱爲「內容」的單個子文件夾中。所以,我能夠阻止我的自定義主要的多次執行通過檢查,看看是否「內容」是HttpContext.Current.Request.Url的一部分,就像這樣:Application_OnAuthenticateRequest對圖像請求執行
protected void Application_OnAuthenticateRequest(Object sender, EventArgs e)
{
if (HttpContext.Current.Request.Url.AbsoluteUri.Contains("/Content"))
return;
if (Context.User != null)
{
if (Context.User.Identity.IsAuthenticated)
{
var userRepository = ObjectFactory.GetInstance<IUserRepository>();
var prospectorUser = userRepository.GetByUserName(Context.User.Identity.Name);
if (prospectorUser == null)
{
throw new ApplicationException("Context.User.Identity.Name is not a recognised user.");
}
var principal = new ExtendedWindowsPrincipal(HttpContext.Current.User.Identity, prospectorUser);
// Attach the new principal object to the current HttpContext object
HttpContext.Current.User = principal;
// Make sure the Principal's are in sync
System.Threading.Thread.CurrentPrincipal = HttpContext.Current.User;
return;
}
}
}
我修復似乎缺憾。有沒有更好的方法來捕獲「內容」項目的請求,並阻止我的委託人的自定義代碼針對每個請求解僱?
我對這種方法的初步嘗試最終阻止了將Content文件夾中的資源下載到客戶端。所以,沒有圖像,CSS,腳本等。我創建了一個攔截請求的httpModule。如果請求中包含uri中的「內容」,那麼我完成了請求並將響應代碼設置爲200,但沒有任何資源正在發送到客戶端。 – 2010-08-23 19:37:38
您可能無法完成請求 - 您仍然需要將請求傳遞給將發送內容的IHttpHandler,或者手動自行發送文件。 – womp 2010-08-23 20:37:15