2009-12-16 67 views
3

mvc1和mvc2有什麼不同?如果用戶未經過身份驗證,我有以下代碼重定向到登錄頁面。這不會MVC2,並導致工作「System.Web.HttpException:HTTP標頭後無法重定向已發送」Asp.net mvc 2 - 從ActionFilter重定向錯誤?

public class RequiresAuthenticationAttribute : FilterAttribute, IAuthorizationFilter 
{ 
    public void OnAuthorization(AuthorizationContext filterContext) 
    { 
    if (!filterContext.HttpContext.User.Identity.IsAuthenticated) 
    { 
     string redirectOnSuccess = filterContext.HttpContext.Request.Url.AbsolutePath; 
     string redirectUrl = string.Format("?ReturnUrl={0}", redirectOnSuccess); 
     string loginUrl = System.Web.Security.FormsAuthentication.LoginUrl + redirectUrl; 
     filterContext.HttpContext.Response.Redirect(loginUrl, true); 
    } 
    } 
} 

堆棧跟蹤如下:

System.Web.HttpException: Cannot redirect after HTTP headers have been sent. 
    at System.Web.HttpResponse.Redirect(String url, Boolean endResponse) 
    at System.Web.HttpResponseWrapper.Redirect(String url, Boolean endResponse) 
    at System.Web.Mvc.RedirectResult.ExecuteResult(ControllerContext context) 
    at System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext, ActionResult actionResult) 
    at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass14.<InvokeActionResultWithFilters>b__11() 
    at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation) 
    at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass14.<>c__DisplayClass16.<InvokeActionResultWithFilters>b__13() 
    at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext, IList`1 filters, ActionResult actionResult) 
    at System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) 
+1

一般來說,你*不*重定向到'OnAuthorization'。 ASP.NET已經爲你做到了。但是,MVC同樣已經處理了授權,您也可以使用任何您喜歡使用或編寫的提供程序。如果不知道你打算重寫的內容以及原因,你很難說出你應該做什麼。一般來說,我認爲開發人員*方式太急於重寫ASP.NET身份驗證,並傾向於錯誤地執行。 http://blogs.teamb.com/craigstuntz/2009/09/09/38390/重定向授權失敗的正確方法是在'web.config'中設置URI。 – 2009-12-16 17:51:47

+0

該網站最初是在創建AuthorizeAttribute之前,在mvc1預覽版2的附近編寫的。在這個問題出現之前,我真的不知道這個屬性是存在的。我會看看它是否能解決我需要的東西。 – 2009-12-16 20:10:37

回答

7

所有你必須要做的是重寫HandleUnauthorizedRequest而不是OnAuthorization,並將RedirectResult url分配給AuthorizationContext.Result。

base.OnAuthorization將檢查身份驗證並在其失敗時調用HandleUnauthorizedRequest。

protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
{ 
    string redirectOnSuccess = filterContext.HttpContext.Request.Url.AbsolutePath; 
    string redirectUrl = string.Format("?ReturnUrl={0}", redirectOnSuccess); 
    filterContext.Result = new RedirectResult(redirectUrl); 
    return; 
} 
+0

優秀 - 這也幫助了我。我有filterContext.Response.Redirect(redirectUrl),這似乎工作,但在後臺拋出錯誤。謝謝 – 2011-08-29 09:31:56