2009-12-16 4 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/ 인증 실패시 리디렉션하는 올바른 방법은 URI를'web.config'에 설정하는 것입니다. –

+0

이 사이트는 원래 AuthorizeAttribute가 만들어지기 전에 mvc1 미리보기 2에서 작성되었습니다. 솔직히이 문제가 발생할 때까지 속성이 존재한다는 사실을 알지 못했습니다. 나는 내가 원하는 것을 해결하는지 살펴볼 것입니다. –

답변

7

당신은 모두 해야 할 일은 OnAuthorization 대신 HandleUnauthorizedRequest를 오버라이드하고 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)가 작동하는 것처럼 보였지만 백그라운드에서 오류가 발생했습니다. 감사 –

관련 문제