1

나는 사용자가 "시스템 관리자"라는 역할에 속하는지 알기 위해 쉬운 필터를 만들려고 시도했다. 기본적으로는 [Authorize(Roles = "System Administrator")]을해야한다. 나는 그것이 매우 간단 할 것이라고 생각했지만 MVC에 상당히 익숙하기 때문에 아마도 뭔가를 바라 볼 것입니다. 여기서 내가 잘못 가고 ASP.Net Identity 2 - 내 필터가 작동하지 않는 이유는 무엇입니까?

using System.Web.Mvc; 

namespace site_redesign_web.Filters 
{ 
    public class SystemAdminFilter : ActionFilterAttribute 
    { 
     string SysAdminRole = "System Administrator"; 

     public override void OnActionExecuting(ActionExecutingContext filterContext) 
     { 
      if (filterContext.RequestContext.HttpContext.User != null) 
      { 
       var userSysAdmin = filterContext.RequestContext.HttpContext.User.IsInRole(SysAdminRole) == true; 
       filterContext.ActionParameters["IsSysAdmin"] = userSysAdmin; 
      } 
     } 
    } 
} 

어떤 사람이 제안 할 수 있습니다 :

여기 내 코드입니까? 거대한 플러스는 사람이 시스템 관리자가 아니면 Home/NoPermissions으로 안내합니다.

감사합니다.

+0

로했다? – Aravind

+0

전체 클래스를 표시하도록 업데이트되었습니다. 고맙습니다! – ajtatum

+0

이 게시물은 더 잘 이해하는 데 도움이 될 수 있습니다. https://code.msdn.microsoft.com/ASPNET-MVC-5-Security-And-44cbdb97 – bijayk

답변

1

업데이트 : 모든 문제를 해결. AJ. 여기이

[SystemAdminFilter]  // at controller level 
public SomeController : Controller 
{ 

} 

해야 마지막 문제

using ActionFilterAttribute 
using System.Web.Mvc; 
namespace site_redesign_web.Filters 
{ 
    public class SystemAdminFilter : ActionFilterAttribute 
    { 
     string SysAdminRole = "System Administrator"; 
     public override void OnActionExecuting(ActionExecutingContext filterContext) 
     { 
      if (filterContext.RequestContext.HttpContext.User != null) 
      { 
       var userSysAdmin = filterContext.RequestContext.HttpContext.User.IsInRole(SysAdminRole) == true; 

      if(!userSysAdmin) 
      { 
       filterContext.Result = new RedirectToRouteResult(
        new System.Web.Routing.RouteValueDictionary{ 
        {"controller", "Home"},  
        {"action", "Index"} 
       }); 
      } 
      } 
     } 
    } 
} 

하고 컨트롤러를 고정 ... 이동하거나 당신이

같은 주석에 의해 특정 액션에 사용할 수 있습니다
public SomeController : Controller 
{ 
    [SystemAdminFilter]  // at Action level 
    public ActionResult SomeAction() 
    { 
      // perform your actions 
    } 

사용자가 수동으로 전달 되었기 때문에 작동합니다. Global.asax에

protected void Application_AuthorizeRequest(Object sender, EventArgs e) 
{ 
    FormsAuthenticationTicket formsAuthenticationTicket = new FormsAuthenticationTicket("Aravind", true, 30); 
    FormsIdentity formsIdentityId = new FormsIdentity(formsAuthenticationTicket); 
    GenericPrincipal genericPrincipal = new GenericPrincipal(formsIdentityId, new string[] { "SystemUser" }); //TEST with this redirected to Home Index place 
    HttpContext.Current.User = genericPrincipal ; 
} 

Application_AuthorizeRequest에서 그의 역할은 내가 만든 다음 테스트는 필터의 전체 클래스를 노출 할 수 있습니다이

GenericPrincipal genericPrincipal = new GenericPrincipal(formsIdentityId, new string[] { "System Administrator" }); //TEST with this did not perform an action 
+0

이것을 구현하려했는데 HTTP 오류 404.15 - 찾을 수 없음 요청 필터링 모듈이 쿼리 문자열이 너무 긴 요청을 거부하도록 구성되었습니다. URL의 길이는 2k를 넘습니다. – ajtatum

+0

은 RegisterGlobalFilters 메서드의 App_Start \ FilterConfig에 필터를 추가하고 있습니까? – Aravind

+0

예! 정말로 무슨 일이 일어나고 있는지 모릅니다. 매우 이상합니다! 고맙습니다! – ajtatum

1

인증을 처리 중이므로 ActionFilterAttribute 대신 일반 AuthorizeAttribute을 확장합니다. 인증이 실패 할 때 실행되는 하나의 메소드 - HandleUnauthorizedRequest 만 대체해야합니다. AuthorizeAttribute의 기본 구현은 이미 역할 기반 권한 부여를 처리합니다. 당신의 속성이 구현되면

public class SystemAdminAttribute : AuthorizeAttribute 
{ 
    private const string SysAdminRole = "System Administrator"; 

    public SystemAdminFilter() 
    { 
     //this defines the role that will be used to authorize the user: 
     this.Roles = SysAdminRole; 
    } 

    //if user is not authorized redirect to "Home/NoPermissions" page 
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     if(!filterContext.HttpContext.User.Identity.IsAuthenticated) 
     { 
      base.HandleUnauthorizedRequest(filterContext); 
     } 
     else 
     { 
      filterContext.Result = new RedirectToRouteResult(new 
       RouteValueDictionary(new { controller = "Home", action = "NoPermissions" })); 
     } 
    }   
} 

, 그것으로 컨트롤러 나 액션에 대응 장식 :

[SystemAdmin] 
public SysAdminController : Controller 
{ 
} 
+0

좋은데, 구현했을 때 NoPermissions 페이지에 익명 사용자를 던졌습니다. 시스템 관리자 권한으로 로그인 한 경우에만 작동합니다. – ajtatum

+0

사용자가 인증되지 않았기 때문에 (이 조건이 true :'! filterContext.HttpContext.User.Identity.IsAuthenticated') 다음 행이 실행되기 때문에 매우 이상합니다 : base.HandleUnauthorizedRequest (filterContext); 페이지. web.config에 그런 것이 있습니까?'' –

+0

그래, 시스템 관리자 역할없이 로그인하면 다음과 같은 메시지가 나타납니다 : localhost 페이지가 작동하지 않습니다 localhost가 너무 많이 리디렉션했습니다. 타임스. – ajtatum

관련 문제