This article解釋了PreRequestHandlerExecute事件不會爲任何原因觸發PageMethod調用。但是,我試圖使用該事件來填充具有用戶權限的Principal對象,以便可以在任何Web請求(PageMethod調用或不調用)中檢查它們。我在會話中緩存權限,因此我需要一個事件,該事件在每次調用PageMethod時觸發,並且需要訪問會話。通過這種方式,我可以使用會話中緩存的安全權限填充Principal對象,User.IsInRole()
調用將按預期工作。我可以使用什麼活動?對於PageMethods,Application_PreRequestHandlerExecute事件不會觸發。我可以用什麼來代替?
回答
您可以使用Application_OnPostAuthenticateRequest如下圖所示(假設您正在使用窗體身份驗證否則,請更換您的身份驗證機制的代碼。):
public void Application_OnPostAuthenticateRequest(object sender, EventArgs e)
{
IPrincipal usr = HttpContext.Current.User;
if (usr.Identity.IsAuthenticated && usr.Identity.AuthenticationType == "Forms")
{
var fIdent = (FormsIdentity)usr.Identity;
var ci = new CustomIdentity(fIdent.Ticket);
var p = new CustomPrincipal(ci);
HttpContext.Current.User = p;
Thread.CurrentPrincipal = p;
}
}
這不適用於我 - 此時我沒有會話。 – 2011-06-13 17:37:29
你可以試試HttpContext.Session [「key」]嗎? – Akhil 2011-06-13 17:42:07
HttpContext.Current.Session爲null。 – 2011-06-13 17:43:55
從我的觀點,你可以點:
1.-使用可以從可訪問會話變量的每個頁面方法服務器代碼中調用的常用方法。請參考: http://mattberseth.com/blog/2007/06/aspnet_ajax_use_pagemethods_pr.html
2.-嘗試稍後使用__doPostBack()函數捕獲類似的行爲來運行服務器代碼。看看這對你的工作來捕獲頁面方法異步posbacks: http://www.dotnetcurry.com/ShowArticle.aspx?ID=256
希望幫助,
你應該實現,將與每一個上升到服務器的請求上運行的授權模塊。這樣,您就能夠授權您所出現的服務器的任何請求委託人(頁面請求,方法等)
public class AuthorizationModule : IHttpModule, IRequiresSessionState
{
//not going to implement it fully, might not compile
public void Init(HttpApplication context)
{
//you'll prolly want to hook up to the acquire request state event, but read up to make sure this is the one you want on the msdn
context.AcquireRequestState += AuthorizeRequest;
}
public void AuthorizeRequest(HttpContextBase httpContext)
{
// do you work in here
// you can redirect them wherever if they don't have permssion, log them out, etc
}
}
}
你裝箱模塊後,你需要把它掛在web.config中。你的類型應該包含命名空間,如果它有的話。
<httpModules>
<add name="AuthorizationModule" type="AuthorizationModule"/>
</httpModules>
我希望這會有所幫助。
頁面方法是靜態的,繞過正常的頁面生命週期,其對象及其事件。您可以做的最好的方法是將認證信息作爲參數傳遞給Page Method本身。
- 1. 我可以用什麼來代替GridView?
- 2. 爲什麼TriggerComplete事件不會觸發?
- 3. 爲什麼DropDownList.SelectedIndexChanged事件不會觸發?
- 4. 爲什麼ajax事件不會觸發?
- 5. 什麼可以用來代替ob_start(「ob_gzhandler」);
- 6. 爲什麼我的事件不會觸發兩個訂戶?
- 7. 爲什麼我的SelectedIndexChanged事件不會在Button_Click中觸發?
- 8. 爲什麼我的javascript鼠標事件不會觸發?
- 9. 爲什麼我的GridView的SelectedIndexChanged事件不會觸發?
- 10. 爲什麼__doPostBack()不會觸發我的綁定加載事件?
- 11. 爲什麼我的提交按鈕事件不會觸發?
- 12. 爲什麼我的'ontouchstart'事件不會在iPhone上觸發?
- 13. 爲什麼我的jquery更改事件不會觸發?
- 14. 爲什麼我的動作腳本事件不會觸發?
- 15. 爲什麼我的FileSystem Watcher不會觸發事件?
- 16. 我可以在Access中使用什麼來替換觸發器和過程?
- 17. 爲什麼可見度變化事件不會針對Android webview觸發?
- 18. 我應該用什麼來代替OnMouseXXX事件處理程序?
- 19. 爲什麼當我使用套接字發射時事件不會觸發?
- 20. 爲什麼Repeater.ItemDataBound - 事件不會觸發任何事情?
- 21. 我們可以用什麼來代替nstimer?
- 22. 我可以使用什麼來代替mysql_fetch_array?
- 23. 我還可以使用什麼來代替HashMap?
- 24. 我可以用什麼來代替#sql表中的sql函數
- 25. 我可以使用什麼來代替DOMSubtreeModified?
- 26. 我可以用什麼來代替箭頭運算符,` - >`?
- 27. 我可以使用什麼來代替Java中的Vector?
- 28. 我可以觸發點擊事件onload
- 29. 爲什麼改變輸入的事件不會用jQuery觸發?
- 30. C#:從對象外部觸發事件的替代方案是什麼?
這些答案中的任何一個能解決您的問題嗎? – 2011-07-23 13:35:21