2010-04-27 50 views
3

我的控制器都擴展了一個基本的UserAwareController類,它公開了GetCurrentUser()方法。如果用戶尚未登錄,我希望對此方法的任何調用重定向到登錄頁面。如何通過從Asp.NET控制器拋出異常來重定向?

我可以通過從此方法拋出一些異常來實現此目的嗎?如何在拋出此異常時導致重定向發生?

+3

你爲什麼不使用'Authorize'屬性?爲什麼你想重塑一些東西,這是非常好的。 – LukLed 2010-04-27 16:55:19

+0

@LukLed - 嗯,我不熟悉Authorize屬性,但是從我收集的內容來看,它並不是我想要的。每個用戶都可以訪問這個動作,他只需要登錄...所以我想將他重定向到登錄頁面。或者我錯過了Authorize如何工作? – ripper234 2010-04-27 17:01:34

+1

在大多數情況下,它的工作原理與您所說的完全相同。如果用戶未登錄,他將被重定向到登錄頁面。 – LukLed 2010-04-27 17:03:50

回答

3

雖然我認爲你應該改變方法有關授權解決方案,你可以和它呆在一起,並使用此代碼:

public partial class BaseUserAwareController : Controller 
{ 
    protected override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     if (GetCurrentUser() == null) 
     { 
      filterContext.Result = new HttpUnauthorizedResult(); 
     } 
    } 
} 

如果你的項目是不是太大了,想想將其更改爲使用[Authorize]。如果你使用它,那也只能是:

[Authorize] 
public partial class UserAwareController : Controller 
{ 

} 

你可能會認爲這不是很大的區別,但也[Authorize]處理一些緩存問題(返回緩存的響應,當你不再被授權)。

安裝MVC 2並創建新的MVC 2 Web應用程序。它包含授權邏輯,您可以在應用程序中使用它們。

+0

您能否指示我解釋授權以及如何正確使用授權關鍵字的鏈接?我不明白我如何將它綁定到我的身份驗證方案(我使用開放標識)。 – ripper234 2010-04-27 17:13:49

+0

@ ripper234:這裏是一篇關於FormsAuthentication的文章,以及您使用[Authorize]屬性必須做的事情:http://blog.codevelop.dk/post/2007/11/24/ASPNET-20-Forms-authentication-Keeping -it-customized-yet-simple.aspx你可以修改它來使用OpenId。 – LukLed 2010-04-27 17:33:05

+0

我嘗試使用授權,它看起來很有希望,除非我遇到了這個問題:http:// stackoverflow。com/questions/2724271/using -a-colon-in-return-url-with-forms-authentication-the-return-url-specif – ripper234 2010-04-27 19:45:09

2

爲什麼不直接使用RedirectRedirectToAction方法來重定向到登錄頁面:

public ActionResult GetCurrentUser() 
{ 
    if (user is not logged in) 
    { 
     Redirect("/LoginPage"); 
    } 
} 

編輯:還是做檢查的基本控制器OnActionExecuting:

public class BaseController : Controller 
{ 
    protected override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     if (GetCurrentUser() == null) 
     { 
      (filterContext.Controller as BaseController).Redirect("/Login"); 
     } 

     base.OnActionExecuting(filterContext); 
    } 

}

http://forums.asp.net/t/1239842.aspx也是這個話題的一個很好的參考。

+0

如果動作不需要調用GetCurrentUser會怎麼樣? – LukLed 2010-04-27 17:06:33

+0

他沒有要求這種情況下,只是如果GetCurrentUser被稱爲 – amurra 2010-04-27 17:12:07

+0

是否重定向拋出異常?我不想重複在每個方法中檢查「if(GetCurrentUser()== null)重定向」的代碼。我更喜歡使用「GetCurrentUser()」,如果沒有'當前用戶',那麼我想要一個重定向操作(通過異常)。 – ripper234 2010-04-27 17:14:48

1

在您的基本控制器中,重寫OnActionExecuting。這使您可以訪問ActionExecutingContext,其中包含HttpContext和響應。

然後,您可以根據您希望像這樣的任何邏輯將用戶重定向:

<ActionContext>.HttpContext.Response.Redirect(<Your Url>) 

我忘記了上下文變量副手的名字,但它是在方法簽名。