2014-10-21 2 views
3

개별 사용자 계정 인증 모드를 사용하는 새 ASP.NET MVC 5 프로젝트에서 액세스 거부 오류 페이지를 구현하려고합니다. 나는 ErrorController.csASP.NET MVC 5 권한 부여 요청 처리

public class ErrorController : Controller 
{ 
    public ActionResult AccessDenied() 
    { 
     return View(); 
    } 
} 

AccessDenied.cshtml보기 다음 HomeController.cs

[CustomAuthorize] 
public class HomeController : Controller 
0에 적용

<h2>Access Denied</h2> 
<p>You do not have access to view this page</p> 

를 추가 AuthorizeAttribute

public class CustomAuthorize : AuthorizeAttribute 
{ 
    protected virtual CustomPrincipal CurrentUser 
    { 
     get { return HttpContext.Current.User as CustomPrincipal; } 
    } 

    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     if (filterContext.HttpContext.Request.IsAuthenticated) 
     { 
      if (!string.IsNullOrEmpty(Roles)) 
      { 
       if (!CurrentUser.IsInRole(Roles)) 
       { 
        filterContext.Result = new RedirectToRouteResult(
         new RouteValueDictionary(new { controller = "Error", action = "AccessDenied" })); 

        //base.OnAuthorization(filterContext); // returns to login url 
       } 
      } 

      if (!string.IsNullOrEmpty(Users)) 
      { 
       if (!Users.Contains(CurrentUser.UserName)) 
       { 
        filterContext.Result = new RedirectToRouteResult(
         new RouteValueDictionary(new { controller = "Error", action = "AccessDenied" })); 

        //base.OnAuthorization(filterContext); // returns to login url 
       } 
      } 
     } 
    } 


    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     if (!filterContext.HttpContext.User.Identity.IsAuthenticated) 
     { 
      base.HandleUnauthorizedRequest(filterContext); 
     } 
     else 
     { 
      filterContext.Result = new RedirectToRouteResult(new 
      RouteValueDictionary(new { controller = "Error", action = "AccessDenied" })); 
     } 
    } 
} 

에서 상속 CustomAuthorize 클래스를 추가

하지만 항상 로그인 페이지로 리디렉션됩니다. 액세스 거부 페이지를 표시하는 방법은 무엇입니까?

+0

가 인증 리디렉션 않는 사용자와 역할에 사용자가 없기 때문에

public class HomeController : Controller { public ActionResult Index() { return View(); } [CustomAuthorize(Roles = "TestRole")] public ActionResult About() { ViewBag.Message = "Your application description page."; return View(); } public ActionResult Contact() { ViewBag.Message = "Your contact page."; return View(); } } 

회원 가입 및 로그인, 당신은 거부 페이지에 액세스 리디렉션거야 소개 링크를 클릭하십시오 잘? – takemyoxygen

+0

@takemyoxygen 가능하지만 AccessDenied 페이지로 리디렉션해야합니다 – Willy

+0

개별 사용자 계정으로 mvc 5 템플릿에서 테스트 했으므로 CustomAuthorize 또는 Error 컨트롤러에 아무런 문제가 없음을 확인할 수 있습니다. 내 대답을 확인해. – DSR

답변

1

개별 사용자 계정으로 새 mvc 5 프로젝트를 만들고 오류 컨트롤러,보기 및 CustomAuthorize 속성 클래스를 추가하십시오.

다음과 같이 홈 컨트롤러를 업데이트하십시오. 로그인 페이지로 'TestRole'

+0

감사합니다 ... – Willy

+1

죄송합니다, CustomAuthorize 클래스에'OnAuthorization' 메서드를 추가하는 것을 잊었습니다. 이 메소드가 존재하면 결코 HandleUnauthorizedRequest에 도달하지 않습니다. – Willy

+0

예, 맞습니다. OnAuthorization 내부에서 처리해야합니다. 상태 코드를 401로 변경해야 할 수도 있습니다. – DSR

관련 문제