Programming/.NET

1. 인증및 권한

 

로그인된(인증된) 사용자에게만 접근을 허용하고자 한다면 필요한 컨트롤러 클래스나 액션메서드에 Authorize 속성을 지정해 인증필터를 구현하면 됩니다.

 

[Authorize]
public ActionResult MyPage()
{
    return View();
}

 

더불어 Authorize 에 특정 사용자나 그룹을 지정해 권한필터를 구현할 수 있습니다. 이때 권한필터는 인증필터이후 액션필터나 메서드가 실행되기 직전에 실행됩니다.

 

[Authorize(Users ="admin")]
public ActionResult MyPage()
{
    return View();
}

 

admin 사용자에게만 MyPage 로의 접근을 허용합니다. 이 속성이 컨틀롤러 클래스에 적용되면 하위 모든 액션메서드가 영향을 받게 됩니다.

 

[Authorize(Roles ="admins")]
public ActionResult MyPage()
{
    return View();
}

 

특정 사용자가 아닌 사용자 그룹단위의 권한인 경우에는 Roles 속성을 지정합니다. 사용자와 그룹모두 2개 이상을 지정해야 하는 경우에는 각 사용자/그룹을 콤마(,)로 구분합니다.

 

2. 예외

 

예외필터는 HandleError 속성을 사용함으로서 구현할 수 있습니다.

 

[HandleError(ExceptionType =typeof(DivideByZeroException)View = "ErrorPage")]
public ActionResult MyPage(int id)
{
    float f = 25 / id;

    return View();
}

 

HandleError에 사용된 ExceptionType은 예외를 발생시키게 되는 예외타입을 지정하며 지정된 해당 타입이외에 다른 예외는 HandleError에서 처리하지 않습니다. 하지만 이 속성을 따로 지정하지 않으면 기본적으로 System.Exception 으로 처리하기에 모든 예외를 다루게 됩니다.

 

View는 예외가 발생했을때 사용자에게 보여질 View페이지를 지정합니다. 이 속성의 기본값은 Error입니다.

 

<body>

     <div> 
        예외 발생 정보 : <br />
        컨트롤러 : @(((HandleErrorInfo)Model).ControllerName)<br />
        메서드 : @(((HandleErrorInfo)Model).ActionName)<br />
        예외내용 : @(((HandleErrorInfo)Model).Exception)
    </div>
</body>

 

참고로 View 페이지에서는 위와 같이 예외를 발생시킨 기본적인 정보를 확인할 수 있습니다.

 

3. 필터 메서드 구현

 

컨트롤러 클래스에서 직접적으로 필터에 대한 메서드를 오버라이드하면 속성을 구현하지 않고도 필터를 적용할 수 있습니다.

 

protected override void OnException(ExceptionContext filterContext)
{
            
}

 

예를 들어 예외처리에 대한 필터는 OnException 으로

 

protected override void OnAuthorization(AuthorizationContext filterContext)
{
            
}

 

인증및 권한에 관한건 OnAuthorization 메서드로 구현됩니다.

 

다만 이렇게 메서드를 오버라이드하여 구현하면 필터는 컨트롤러 클래스 단위로 적용됩니다.

 

4. 전역 필터

 

전역필터는 모든 컨트롤러 클래스와 액션 메서드에 적용되는 필터로서 App_Start 폴더에 있는 FilterConfig.cs 파일안에서 정의됩니다.

 

namespace Filters
{
    public class FilterConfig
    {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            
        }
    }
}

 

만약 App_Start 안에 FilterConfig.cs 파일이 없다면 위 내용대로 새로운 파일을 만들어야 합니다.

 

namespace Filters
{
    public class FilterConfig
    {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(new HandleErrorAttribute());
        }
    }
}

 

필터의 추가는 filters개체의 Add 메서드를 통해 추가할 수 있습니다. 예제에서는 HandleErrorAttribute 개체를 생성해 등록하고 있으므로 프로그램에서의 모든 예외를 여기서 처리하게 됩니다.

 

위와 같이 전역적으로 사용할 필터를 등록했으면 Global.asax 파일에서 해당 필터가 동작할 수 있게끔 다음과 같이 설정해야 합니다.

 

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
}

'Programming > .NET' 카테고리의 다른 글

[C#] 익명메서드(anonymous method)  (0) 2018.04.10
[ASP.NET MVC] Web API  (0) 2018.03.28
[ASP.NET MVC] 필터(Filter)  (0) 2018.03.20
[ASP.NET MVC] 컨트롤러(Controller)  (0) 2018.03.14
[C#] File / FileInfo  (0) 2018.03.07
[C#] Hashtable / SortedList  (0) 2018.02.27
0 0