[ASP.NET MVC5] 페이지별 사용자 접근 권한 확인(Action Filter 활용)
ASP.NET MVC5에서 특정 페이지에 접근 가능한 유저인지 확인하는 기능은 보안과 사용자 경험의 핵싱 요소중 하나이다.
이번 포스팅에서는 ASP.NET MVC5에서 제공하는 사용자의 권한 부여 여부에 따른 페이지 접근을 제어하는 방법을 알아보고자 한다.
1. 데이터베이스 테이블 설계
권한 확인을 위해 아래와 같은 테이블 구조를 사용할 수 있다. (예시)
CREATE TABLE Users (
UserId INT PRIMARY KEY,
UserName NVARCHAR(100)
);
CREATE TABLE PagePermissions (
PageId INT PRIMARY KEY,
PageUrl NVARCHAR(200)
);
CREATE TABLE UserPermissions (
UserId INT,
PageId INT,
FOREIGN KEY (UserId) REFERENCES Users(UserId),
FOREIGN KEY (PageId) REFERENCES PagePermissions(PageId)
);
- Users: 사용자 정보를 저장
- PagePermissions: 페이지 URL과 ID를 저장
- UserPermissions: 사용자와 페이지 간의 권한 관계를 정의
2. 권한 확인 메서드 작성
Entity Framework를 활용하여 데이터베이스에서 사용자 권한을 확인하는 메서드를 작성한다.
public bool HasAccess(int userId, string pageUrl)
{
using (var context = new ApplicationDbContext())
{
// 페이지 ID 가져오기
var page = context.PagePermissions.FirstOrDefault(p => p.PageUrl == pageUrl);
if (page == null)
return false;
// 사용자의 페이지 접근 권한 확인
return context.UserPermissions.Any(up => up.UserId == userId && up.PageId == page.PageId);
}
}
- 페이지 확인: PagePermissions 테이블에서 요청된 URL에 해당하는 페이지 정보를 가져온다.
- 권한 확인: UserPermissions 테이블에서 사용자와 페이지 간의 관계를 확인한다.
3. 커스텀 Authorization Filter 작성
ASP.NET MVC의 Action Filter를 사용하여 페이지 요청 전 사용자 권한을 확인한다.
public class CustomAuthorizationAttribute: ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var userId = (int?)filterContext.HttpContext.Session["UserId"];
var pageUrl = filterContext.HttpContext.Request.RawUrl;
if (userId == null || !HasAccess(userId.Value, pageUrl))
{
filterContext.Result = new RedirectResult("/Account/Login");
}
base.OnActionExecuting(filterContext);
}
private bool HasAccess(int userId, string pageUrl)
{
using (var context = new ApplicationDbContext())
{
var page = context.PagePermissions.FirstOrDefault(p => p.PageUrl == pageUrl);
if(page == null)
return false;
return context.UserPermissions.Any(up => up.UserId == userId && up.PageId == page.PageId);
}
}
}
필터 동작
1. Session에서 사용자 ID 확인: 사용자 ID가 없는 경우 로그인 페이지로 리다이렉트
2. 페이지 URL과 권한 확인: 데이터베이스를 조회하여 해당 페이지에 대한 접근 권한을 검증
3. 권한이 없는 경우: 요청을 차단하고 로그인 페이지로 리다이렉트
Action Filter는 ASP.NET MVC의 강력한 기능으로, 컨트롤러의 액션 메서드가 실행되기 전에 특정 코드를 실행하거나, 실행 이후 작업을 처리할 수 있다.
(Action Filter에 대한 내용은 이 포스팅에서 더 확인할 수 있다.)
4. 필터 적용
컨트롤러 전체에 적용
컨트롤러의 모든 액션에 권한 확인을 적용하려면 클래스에 필터를 추가한다.
[CustomAuthorization]
public class HomeController: Controller
{
public ActionResult Index()
{
return View();
}
public ActionResult About()
{
return View();
}
}
특정 액션에만 적용
필요한 액션에만 필터를 적용할 수도 있다.
public class HomeController: Controller
{
[CustomAuthorization]
public ActionResult SecurePage()
{
return View();
}
}
결론
ASP.NET MVC5에서 사용자 권한을 확인하는 방법은 데이터베이스와 Action Filter를 조합하여 구현할 수 있다.
주요 포인트는 다음과 같다.
1. 데이터 베이스 설계: 사용자와 페이지 간의 권한 관계를 명확히 정의한다.
2. 권한 확인 메서드: 데이터베이스 조회를 통해 권한을 검증한다.
3. Action Filter 활용: 필터를 통해 페이지 요청 전에 권한을 확인한다.
이 방법을 통해 페이지별로 접근 권한을 제어할 수 있으며, 애플리케이션 보안을 한층 강화할 수 있다.
#References