2011-08-25 3 views
1

내 컨트롤러에서 반환하려면 액세스 거부 ActinoResult 만들려고합니다. 나는ASP.Net MVC 3 ActionResult 경로로 리디렉션하는 방법

public class AccessDeniedResult : ActionResult 
{ 
    public override void ExecuteResult(ControllerContext context) 
    { 
     if (null != context && null != context.HttpContext && null != context.HttpContext.Response) 
     { 
      context.HttpContext.Response.StatusCode = 401; 
      context.HttpContext.Response.RedirectToRoute("AccessDenied"); 
     } 
    } 
} 

이 때문에 HttpResponseBase에서 오는 NotImplementedException 작동하지 않습니다이 context.HttpContext.Response로 전달되는 다음과 같은 구현을 가지고있다.

어떻게하면 MVC3에서 올바른 리디렉션 작업 결과를 작성합니까?

+0

http://msdn.microsoft.com/en-us/library/system.web.httpresponsewrapper.redirecttoroute.aspx에 대한 의견은 있지만 해결책은 없습니다. – Jason

답변

4

은 당신과 같이 HttpUnauthorizedResult 반환해야합니다

return new HttpUnauthorizedResult(); 

을 추가로를, 당신은 생성 고려해야 AuthorizeAttribute로부터 파생 해, 보안 체크를 실시하는 새로운 클래스입니다. 그런 다음 클라이언트가 직접 위치를 제어 할 Web.config의이 지시문을 추가 할 수 있습니다

:

<customErrors mode="On" defaultRedirect="~/Home/Error"> 
    <error statusCode="401" redirect="~/AccessDenied" /> 
</customErrors> 

마지막으로, 사용자가 ~/AccessDenied에 관한 것이다 때 발생하는 제어하기 위해 사용자 정의 경로를 추가 할 수 있습니다

Route route = routes.MapRoute("AccessDeniedRoute", "AccessDenied", new { controller = "MyCustomErrorController", action = "My401Action" }); 
RouteTable.Routes.Add(route); 
0

아마도 RedirectToRouteResult (ActionResult를 상속)에서 상속을 시도해야 할 수도 있습니다.

또한 그들이 그것을 어떻게보고 그 클래스의 소스 코드를 볼 수 있습니다

public override void ExecuteResult(ControllerContext context) { 
    if (context == null) { 
     throw new ArgumentNullException("context"); 
    } 
    if (context.IsChildAction) { 
     throw new InvalidOperationException(MvcResources.RedirectAction_CannotRedirectInChildAction); 
    } 

    string destinationUrl = UrlHelper.GenerateUrl(RouteName, null /* actionName */, null /* controllerName */, RouteValues, Routes, context.RequestContext, false /* includeImplicitMvcValues */); 
    if (String.IsNullOrEmpty(destinationUrl)) { 
     throw new InvalidOperationException(MvcResources.Common_NoRouteMatched); 
    } 

    context.Controller.TempData.Keep(); 

    if (Permanent) { 
     context.HttpContext.Response.RedirectPermanent(destinationUrl, endResponse: false); 
    } 
    else { 
     context.HttpContext.Response.Redirect(destinationUrl, endResponse: false); 
    } 
}