역할 기반 권한부여
액션과 액션 결과는 개발자가 ASP.NET Core MVC로 응용 프로그램을 구축할 때 가장 근간이 되는 부분입니다.
신원(Identity)을 생성할 때 해당 신원에 하나 이상의 역할을 부여할 수 있습니다.
가령, Tracy에게는 Administrator 역할과 User 역할을 동시에 부여하고 Scott에게는 User 역할만 부여할 수 있습니다.
이런 역할들이 생성되고 관리되는 방식은 권한부여 절차에 사용되는 백업 저장소에 따라 달라집니다.
개발자는 ClaimsPrincipal 클래스의 IsInRole 속성을 이용해서 역할에 접근할 수 있습니다.
역할 검사 추가하기
역할 기반의 권한 검사는 선언적인 방식으로 구성됩니다.
개발자는 요청된 리소스에 사용자가 접근하기 위해서 필요한 역할을 컨트롤러나 컨트롤러 액션 코드에 지정하는 방식으로 역할 기반 권한 검사를 구현합니다.
가령, 다음 코드는 Administrator
그룹에 포함된 사용자만 AdministrationController
의 모든 액션에 접근할 수 있게 제한합니다:
[Authorize(Roles = "Administrator")]
public class AdministrationController : Controller
{
}
다음과 같이 쉼표(,)로 연결된 목록을 전달해서 다수의 역할을 지정할 수도 있습니다:
[Authorize(Roles = "HRManager,Finance")]
public class SalaryController : Controller
{
}
이 컨트롤러는 HRManager
역할이나 Finance
역할을 부여 받은 사용자만 접근할 수 있습니다.
동시에 여러 개의 어트리뷰트를 적용하면 지정된 역할들을 모두 부여 받은 사용자만 리소스에 접근할 수 있습니다.
예를 들어, 다음 예제는 PowerUser
역할과 ControlPanelUser
역할을 모두 부여 받은 사용자만 컨트롤러에 접근할 수 있도록 제한합니다:
[Authorize(Roles = "PowerUser")]
[Authorize(Roles = "ControlPanelUser")]
public class ControlPanelController : Controller
{
}
역할 권한부여 어트리뷰트를 액션 수준에 추가로 적용해서 접근을 더욱 제한할 수도 있습니다:
[Authorize(Roles = "Administrator, PowerUser")]
public class ControlPanelController : Controller
{
public ActionResult SetTime()
{
}
[Authorize(Roles = "Administrator")]
public ActionResult ShutDown()
{
}
}
이 예제 코드에서 Administrator
역할이나 PowerUser
역할을 부여 받은 사용자는 컨트롤러와 SetTime
액션에 접근할 수 있습니다.
그러나 ShutDown
액션은 Administrator
역할을 부여 받은 사용자만 접근이 가능합니다.
또는 컨트롤러 자체는 잠그고, 개별 액션만 인증되지 않은 익명 사용자에게 접근을 허용할 수도 있습니다:
[Authorize]
public class ControlPanelController : Controller
{
public ActionResult SetTime()
{
}
[AllowAnonymous]
public ActionResult Login()
{
}
}
정책 기반의 역할 검사
응용 프로그램 구동시 Authorization 서비스 구성의 일부로 개발자가 등록한 정책을 사용하는 새로운 Policy 구문을 활용해서 역할 요구사항을 표현할 수도 있습니다.
일반적으로 이 작업은 Startup.cs 파일의 ConfigureServices()
메서드에서 수행됩니다:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.AddAuthorization(options =>
{
options.AddPolicy("RequireAdministratorRole", policy => policy.RequireRole("Administrator"));
});
}
이렇게 등록된 정책은 Authorize
어트리뷰트의 Policy
속성을 통해서 적용됩니다:
[Authorize(Policy = "RequireAdministratorRole")]
public IActionResult Shutdown()
{
return View();
}
단일 요구사항에 다수의 허용되는 역할을 지정하고 싶다면, 해당 역할들을 RequireRole
메서드에 매개변수로 전달하면 됩니다:
options.AddPolicy("ElevatedRights", policy =>
policy.RequireRole("Administrator", "PowerUser", "BackupAdministrator"));
이 예제 코드는 Administrator
역할, PowerUser
역할, BackupAdministrator
역할을 부여받은 사용자에게 권한을 부여합니다.