1

관리자 사이트와 공개 사이트가있는 MVC3 사이트가 있습니다. 컨트롤러, 뷰, 모델 등은 동일한 단일 MVC 프로젝트에 있습니다. 따라서 관리자 사이트는 Admin이라는 MVC3 영역에 있고 공용 사이트는 특정 영역에 속하지 않지만 최상위 수준에 있습니다. 관리 사이트에는 로그인보기가 있고 공개 사이트에는 로그인보기도 있습니다. 내 web.config 파일에서 나는이 :여러 양식 로그인 페이지

<authentication mode="Forms"> 
    <forms loginUrl="~/Account/LogIn" timeout="2880" /> 
</authentication> 

를 자, 내가 대단한 공공 사이트의 로그인 페이지로 이동 얻을 인증을 요구하는 공개 사이트의 모든 페이지에 액세스합니다. 그러나 관리 영역에서 인증이 필요한 페이지에 액세스하면 공개 사이트의 로그인 페이지로 다시 이동합니다. 그러면 문제는 관리자 로그인 페이지로 전송되는 인증을 요구하는 관리 영역의 페이지에있는 경우 어떻게해야합니까?

답변

6

지역화 된 로그인 페이지가 필요할 때 비슷한 문제가 발생했습니다. 나는 사용자 지정 권한 부여 특성을 만듭니다

public class CustomAuthorize : AuthorizeAttribute 
{ 
    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     base.OnAuthorization(filterContext); 
     if (filterContext.Result is HttpUnauthorizedResult) 
     { 
      filterContext.Result = new RedirectToRouteResult(
       new System.Web.Routing.RouteValueDictionary 
        { 
          { "language", filterContext.RouteData.Values[ "language" ] }, 
          { "controller", "Account" }, 
          { "action", "LogOn" }, 
          { "ReturnUrl", filterContext.HttpContext.Request.RawUrl } 
        }); 
     } 
    } 
} 

그냥 기본 권한 부여 속성 대신이 속성을 사용합니다. 귀하의 경우 요청 URL을 확인하고 리디렉션에 따라 해당 로그인 페이지를 확인할 수 있습니다.

2

사용자 지정 Authorize 특성을 작성하고 관리자가 요청했는지 여부를 테스트하고 그에 따라 리디렉션 할 수있는 HandleUnauthorizedRequest 메서드를 재정의 할 수 있습니다. 의 라인을 따라

뭔가 :

public class MyAuthorizeAttribute: AuthorizeAttribute 
{ 
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     var area = filterContext.RequestContext.RouteData.Values["area"] as string; 
     if (string.Equals("admin", area, StringComparison.OrdinalIgnoreCase)) 
     { 
      // if the request was for a resource inside the admin area 
      // redirect to a different login page than the one in web.config 
      // in this particular case we redirect to the index action 
      // of the login controller in the admin area. Adapt this 
      // accordingly to your needs. You could also externalize this 
      // url in the web.config and fetch it from there if you want 

      var requestUrl = filterContext.HttpContext.Request.Url; 
      var urlHelper = new UrlHelper(filterContext.RequestContext); 
      var url = urlHelper.Action(
       "index", 
       "login", 
       new 
       { 
        area = "admin", 
        returnUrl = requestUrl.ToString() 
       } 
      ); 
      filterContext.Result = new RedirectResult(url); 
     } 
     else 
     { 
      base.HandleUnauthorizedRequest(filterContext); 
     } 
    } 
} 

그리고 지금은 기본 일 대신 속성을 인증이 사용자 정의를 사용합니다.

0

filterContext.RouteData.DataTokens [ "area"]; 대신 filterContext.RouteData.Values ​​[ "area"]; 이런

public class AreaAuthorizeAttribute : AuthorizeAttribute 
{ 
    public string LoginController = "Account"; 
    public string LoginAction = "Login"; 

    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     base.OnAuthorization(filterContext); 
     if (filterContext.Result is HttpUnauthorizedResult) 
     { 
      var area = filterContext.RouteData.DataTokens["area"]; 
      filterContext.Result = new RedirectToRouteResult(
       new System.Web.Routing.RouteValueDictionary 
       { 
        { "area", area}, 
        { "controller", LoginController }, 
        { "action", LoginAction }, 
        { "ReturnUrl", filterContext.HttpContext.Request.RawUrl } 
       }); 
     } 
    } 

사용 :

[AreaAuthorizeAttribute (= "AreaLoginController"인 LoginController, 역할 = "관리자")]