這個問題已經讓我有些日子了,所以在尋找答案肯定與tvanfosson上面的答案一致時,我認爲值得強調答案的核心部分,並解決一些相關的問題。
的核心答案是這樣的,甜的和簡單的:
filterContext.Result = new HttpUnauthorizedResult();
在我的情況下,我從一個基本控制器繼承,所以在每一個從它繼承控制器我重寫OnAuthorize:
protected override void OnAuthorization(AuthorizationContext filterContext)
{
base.OnAuthorization(filterContext);
YourAuth(filterContext); // do your own authorization logic here
}
問題是,在'YourAuth'中,我嘗試了兩件我認爲不僅可行的事情,而且還會立即終止請求。那麼,這不是它的工作原理。所以,第一,兩件事情,不工作,意外:
filterContext.RequestContext.HttpContext.Response.Redirect("/Login"); // doesn't work!
FormsAuthentication.RedirectToLoginPage(); // doesn't work!
不僅那些沒有工作,他們不兩端的請求。這意味着:
if (!success) {
filterContext.Result = new HttpUnauthorizedResult();
}
DoMoreStuffNowThatYouThinkYourAuthorized();
好了,即使有以上正確答案,邏輯流依然延續!您仍然會在OnAuthorize中點擊DoMoreStuff ...。所以請記住(DoMore ...應該在其他地方)。
但有了正確的答案,雖然OnAuthorize邏輯流程一直持續到結束,然後你確實得到你所期望的:重定向到你的登錄頁面(如果你在你的webconfig中有一個設置在Forms auth中) 。
但出乎意料的是, 1)的Response.Redirect( 「/登錄」)不工作:操作方法仍然被調用,並 2)FormsAuthentication.RedirectToLoginPage();做同樣的事情:Action方法仍然被調用!
對我來說,這似乎完全錯誤,特別是對於後者:誰會認爲FormsAuthentication.RedirectToLoginPage不會結束請求,或者執行上述filterContext.Result = new HttpUnauthorizedResult()的等價操作?
我不認爲有一個我可以去的鏈接,這個鏈接把它分解成更容易遵循推理? – Maslow 2010-01-18 02:12:16