AddAuthorization을 사용한 역할 기반 권한 정책

  • 6 minutes to read

AddAuthorization을 사용한 관리자, 매니저, 전역 관리자(GlobalAdministrators) 권한 정책 구성

이 문서에서는 ASP.NET Core 애플리케이션에서 AddAuthorization 메서드를 사용하여 역할 기반 권한 정책(Role-based Authorization Policies)을 설정하는 방법을 설명합니다.
특히, 전역 관리자(Administrators + 특정 이메일), 일반 관리자(Administrators), 매니저(Managers) 역할을 기준으로 정책을 구성하는 방법을 다룹니다.


코드 예시

https://github.com/VisualAcademy/Hawaso

#region GlobalAdministrators Policy 설정
// GlobalAdministrators 이메일 목록 읽기
// - appsettings.json의 "AuthorizationSettings:GlobalAdministrators" 배열을 읽어옵니다.
// - 값이 없으면 빈 리스트로 초기화하여 NullReferenceException을 방지합니다.
var globalAdminEmails = builder.Configuration
    .GetSection("AuthorizationSettings:GlobalAdministrators")
    .Get<List<string>>() ?? new List<string>();
#endregion

#region Authorization Policy Configuration
// 정책 기반 권한 설정
builder.Services.AddAuthorization(options =>
{
    // "AdminOnly" 정책:
    // - "Administrators" 역할을 가진 사용자만 접근 허용
    options.AddPolicy("AdminOnly", policy =>
        policy.RequireRole("Administrators"));

    // "ManagerOnly" 정책:
    // - "Managers" 역할을 가진 사용자만 접근 허용
    options.AddPolicy("ManagerOnly", policy =>
        policy.RequireRole("Managers"));

    #region GlobalAdministrators Policy 설정
    // "GlobalAdministrators" 정책 정의
    // - 조건 1: "Administrators" 역할(Role)에 속해야 합니다.
    // - 조건 2: 이메일(ClaimTypes.Email)이 globalAdminEmails 리스트에 포함되어야 합니다.
    options.AddPolicy("GlobalAdministrators", policy =>
        policy.RequireAssertion(context =>
            context.User.IsInRole("Administrators") &&
            context.User.HasClaim(c =>
                c.Type == ClaimTypes.Email &&
                globalAdminEmails.Contains(c.Value, StringComparer.OrdinalIgnoreCase))
        )
    );
    #endregion
});
#endregion

appsettings.json 설정 예시

{
    "AppName": "Hawaso",

    "AuthorizationSettings": {
        "GlobalAdministrators": [
            "a@a.com",
            "b@b.com"
        ]
    }
}

AuthorizationSettings:GlobalAdministrators 배열에 이메일을 등록하여, 코드 수정 없이 관리자가 될 이메일을 손쉽게 변경할 수 있습니다.
설정 값이 없을 경우를 대비하여 빈 리스트(new List<string>())로 안전하게 초기화합니다.


정책별 설명

  • AddAuthorization 메서드는 애플리케이션 전반에서 사용할 정책 기반 권한(Policy-Based Authorization)을 정의합니다.
  • AddPolicy 메서드를 사용하여 고유한 정책 이름과 조건을 설정할 수 있습니다.
  • RequireRole 메서드는 지정된 역할(Role)을 가진 사용자만 해당 정책을 통과할 수 있도록 제한합니다.
  • RequireAssertion 메서드를 사용하면 역할(Role)과 이메일(Claim) 같은 복합 조건을 자유롭게 작성할 수 있습니다.

정책 적용 예시

AdminOnly 정책 적용

@attribute [Authorize(Policy = "AdminOnly")]

Administrators 역할을 가진 사용자만 접근할 수 있습니다.

ManagerOnly 정책 적용

@attribute [Authorize(Policy = "ManagerOnly")]

Managers 역할을 가진 사용자만 접근할 수 있습니다.

GlobalAdministrators 정책 적용

@attribute [Authorize(Policy = "GlobalAdministrators")]

Administrators 역할을 가지면서, 등록된 이메일 목록에 포함된 사용자만 접근할 수 있습니다.


주의사항

  • AddAuthorization 메서드는 한 번만 호출해야 하며, 중복 호출할 경우 마지막 설정만 적용됩니다.
  • 정책 이름은 중복되면 안 됩니다.
  • RequireRole 메서드는 내부적으로 User.IsInRole 메서드를 기반으로 작동하므로, 역할 이름을 정확히 일치시켜야 합니다.
  • RequireAssertion 메서드를 사용하여 복합 조건을 설정하는 경우, 사용자의 Claims 정보가 로그인 시점에 정확히 발급되고 매핑되어야 합니다.
  • 이메일 리스트를 appsettings.json으로 관리하면, 운영 중에도 코드 수정 없이 권한 대상을 변경할 수 있습니다.

ASP.NET Core UI에서 정책 사용하기

ASP.NET Core에서는 정의된 정책을 UI 레벨에서도 다양하게 활용할 수 있습니다.
주로 Razor Components, Razor Pages, MVC Views에서 메뉴 표시, 버튼 노출, 페이지 접근 제어 등에 적용할 수 있습니다.


Razor 컴포넌트에 [Authorize] 적용

@attribute [Authorize(Policy = "GlobalAdministrators")]

<h3>Global Admin 전용 페이지</h3>
<p>이 페이지는 최고 관리자만 볼 수 있습니다.</p>

이 컴포넌트는 GlobalAdministrators 정책을 통과한 사용자만 접근할 수 있습니다.


Razor Page나 MVC Controller에 [Authorize] 적용

[Authorize(Policy = "AdminOnly")]
public class AdminDashboardModel : PageModel
{
    public void OnGet()
    {
        // 관리자 전용 페이지 로직
    }
}
[Authorize(Policy = "ManagerOnly")]
public class ManagerReportsController : Controller
{
    public IActionResult Index()
    {
        return View();
    }
}

각각 지정된 역할에 해당하는 사용자만 접근할 수 있도록 보호합니다.


Razor 뷰(.cshtml) 안에서 조건부 렌더링

사용자 권한에 따라 메뉴나 버튼을 동적으로 표시할 수 있습니다.

@inject IAuthorizationService AuthorizationService

@{
    var authResult = await AuthorizationService.AuthorizeAsync(User, "GlobalAdministrators");
}

@if (authResult.Succeeded)
{
    <li class="nav-item">
        <a class="nav-link" href="/Administrations/SpecialManage">
            <span class="nav-icon oi oi-star" aria-hidden="true"></span> Global Admin Panel
        </a>
    </li>
}

GlobalAdministrators 권한을 가진 사용자만 해당 메뉴가 렌더링됩니다.


버튼 표시/숨김 제어

@{
    var adminOnly = await AuthorizationService.AuthorizeAsync(User, "AdminOnly");
}

@if (adminOnly.Succeeded)
{
    <button class="btn btn-primary">관리자 전용 버튼</button>
}

권한이 없는 사용자는 버튼 자체가 렌더링되지 않습니다.
이는 UI 보안과 사용자 경험(UX)을 동시에 향상시키는 방법입니다.


UI 사용 시 주의사항

  • IAuthorizationService는 Razor View(.cshtml)나 Razor Component(.razor) 파일 상단에서 @inject를 통해 주입해야 합니다.
  • AuthorizeAsync(User, "PolicyName") 메서드는 비동기 메서드이므로 await를 반드시 사용해야 합니다.
  • UI에서 메뉴나 버튼을 숨기더라도, 서버 측 API나 PageModel에도 [Authorize(Policy = "...")]를 적용하여 이중 보호를 해야 합니다.

관련 문서

더 깊이 공부하고 싶다면
DevLec에서는 실무 중심의 C#, .NET, ASP.NET Core, Blazor, 데이터 액세스 강좌를 단계별로 제공합니다. 현재 수강 가능한 강좌 외에도 더 많은 과정이 준비되어 있습니다.
DevLec.com에서 자세한 커리큘럼을 확인해 보세요.
DevLec 공식 강의
C# Programming
C# 프로그래밍 입문
프로그래밍을 처음 시작하는 입문자를 위한 C# 기본기 완성 과정입니다.
ASP.NET Core 10.0
ASP.NET Core 10.0 시작하기 MVC Fundamentals Part 1 MVC Fundamentals Part 2
웹 애플리케이션의 구조와 MVC 패턴을 ASP.NET Core로 실습하며 익힐 수 있습니다.
Blazor Server
풀스택 웹개발자 과정 Part 1 풀스택 웹개발자 과정 Part 2 풀스택 웹개발자 과정 Part 3
실무에서 바로 활용 가능한 Blazor Server 기반 관리자·포털 프로젝트를 만들어 봅니다.
Data & APIs
Entity Framework Core 시작하기 ADO.NET Fundamentals Blazor Server Fundamentals Minimal APIs
데이터 액세스와 Web API를 함께 이해하면 실무 .NET 백엔드 개발에 큰 도움이 됩니다.
VisualAcademy Docs의 모든 콘텐츠, 이미지, 동영상의 저작권은 박용준에게 있습니다. 저작권법에 의해 보호를 받는 저작물이므로 무단 전재와 복제를 금합니다. 사이트의 콘텐츠를 복제하여 블로그, 웹사이트 등에 게시할 수 없습니다. 단, 링크와 SNS 공유, Youtube 동영상 공유는 허용합니다. www.VisualAcademy.com
박용준 강사의 모든 동영상 강의는 데브렉에서 독점으로 제공됩니다. www.devlec.com