다음을 통해 공유


.NET 마이크로 서비스 및 웹 애플리케이션의 권한 부여 정보

팁 (조언)

이 콘텐츠는 .NET Docs 또는 오프라인으로 읽을 수 있는 다운로드 가능한 무료 PDF로 제공되는 컨테이너화된 .NET 애플리케이션용 .NET 마이크로 서비스 아키텍처인 eBook에서 발췌한 내용입니다.

컨테이너화된 .NET 애플리케이션을 위한 .NET 마이크로서비스 아키텍처 eBook의 표지 썸네일.

인증 후 ASP.NET Core Web API는 액세스 권한을 부여해야 합니다. 이 프로세스를 사용하면 서비스에서 일부 인증된 사용자는 API를 사용할 수 있지만, 모든 사용자가 사용할 수는 없습니다. 권한 부여 는 사용자의 역할에 따라 또는 클레임 또는 기타 추론 검사를 포함할 수 있는 사용자 지정 정책에 따라 수행할 수 있습니다.

다음 예제와 같이 ASP.NET Core MVC 경로에 대한 액세스를 제한하는 것은 작업 메서드(또는 모든 컨트롤러의 작업에 권한 부여가 필요한 경우 컨트롤러의 클래스)에 Authorize 특성을 적용하는 것만큼 쉽습니다.

public class AccountController : Controller
{
    public ActionResult Login()
    {
    }

    [Authorize]
    public ActionResult Logout()
    {
    }
}

기본적으로 매개 변수 없이 Authorize 특성을 추가하면 해당 컨트롤러 또는 작업에 대해 인증된 사용자에 대한 액세스가 제한됩니다. 특정 사용자만 사용할 수 있도록 API를 추가로 제한하기 위해 특성을 확장하여 사용자가 충족해야 하는 필수 역할 또는 정책을 지정할 수 있습니다.

역할 기반 권한 부여 구현

ASP.NET Core Identity는 역할 개념을 기본적으로 제공합니다. ASP.NET Core Identity는 사용자 외에도 애플리케이션에서 사용하는 다양한 역할에 대한 정보를 저장하고 어떤 사용자가 어떤 역할에 할당되는지 추적합니다. 이러한 할당은 지속형 스토리지의 RoleManager 역할을 업데이트하는 형식과 UserManager 사용자로부터 역할을 부여하거나 취소할 수 있는 형식을 사용하여 프로그래밍 방식으로 변경할 수 있습니다.

JWT 전달자 토큰을 사용하여 인증하는 경우 ASP.NET Core JWT 전달자 인증 미들웨어는 토큰에 있는 역할 클레임에 따라 사용자의 역할을 채웁니다. MVC 작업 또는 컨트롤러에 대한 액세스를 특정 역할의 사용자로 제한하려면 다음 코드 조각과 같이 권한 부여 주석(특성)에 역할 매개 변수를 포함할 수 있습니다.

[Authorize(Roles = "Administrator, PowerUser")]
public class ControlPanelController : Controller
{
    public ActionResult SetTime()
    {
    }

    [Authorize(Roles = "Administrator")]
    public ActionResult ShutDown()
    {
    }
}

이 예제에서는 관리자 또는 PowerUser 역할의 사용자만 ControlPanel 컨트롤러의 API(예: SetTime 작업 실행)에 액세스할 수 있습니다. ShutDown API는 관리자 역할의 사용자에 대한 액세스만 허용하도록 추가로 제한됩니다.

사용자가 여러 역할에 있어야 하려면 다음 예제와 같이 여러 권한 부여 특성을 사용합니다.

[Authorize(Roles = "Administrator, PowerUser")]
[Authorize(Roles = "RemoteEmployee ")]
[Authorize(Policy = "CustomPolicy")]
public ActionResult API1 ()
{
}

이 예제에서 API1을 호출하려면 사용자는 다음을 수행해야 합니다.

  • 관리자 또는 PowerUser 역할에 있어야 하며

  • RemoteEmployee 역할에 있고

  • CustomPolicy 권한 부여에 대한 사용자 지정 처리기를 충족합니다.

정책 기반 권한 부여 구현

권한 부여 정책을 사용하여 사용자 지정 권한 부여 규칙을 작성할 수도 있습니다. 이 섹션에서는 개요를 제공합니다. 자세한 내용은 ASP.NET 권한 부여 워크샵을 참조하세요.

사용자 지정 권한 부여 정책은 서비스의 AddAuthorization 메서드를 사용하여 Startup.ConfigureServices 메서드에 등록됩니다. 이 메서드는 AuthorizationOptions 인수를 구성하는 대리자를 사용합니다.

services.AddAuthorization(options =>
{
    options.AddPolicy("AdministratorsOnly", policy =>
        policy.RequireRole("Administrator"));

    options.AddPolicy("EmployeesOnly", policy =>
        policy.RequireClaim("EmployeeNumber"));

    options.AddPolicy("Over21", policy =>
        policy.Requirements.Add(new MinimumAgeRequirement(21)));
});

예제와 같이 정책은 다양한 유형의 요구 사항과 연결할 수 있습니다. 정책을 등록한 후에는 정책 이름을 Authorize 특성의 정책 인수로 전달하여 작업 또는 컨트롤러에 적용할 수 있습니다(예 [Authorize(Policy="EmployeesOnly")]: 이러한 예제와 같이 정책에는 하나만 있는 것이 아니라 여러 요구 사항이 있을 수 있습니다).

이전 예제에서 첫 번째 AddPolicy 호출은 역할별로 권한을 부여하는 다른 방법일 뿐입니다. API에 적용되는 경우 [Authorize(Policy="AdministratorsOnly")] 관리자 역할의 사용자만 API에 액세스할 수 있습니다.

두 번째 AddPolicy 호출은 사용자에게 특정 클레임이 있어야 함을 요구하는 쉬운 방법을 보여 줍니다. 이 메서드는 또한 옵션으로 클레임에 대한 예상 값을 받을 수 있습니다. 값을 지정하면 사용자에게 올바른 형식의 클레임과 지정된 값 중 하나가 모두 있는 경우에만 요구 사항이 충족됩니다. JWT 전달자 인증 미들웨어를 사용하는 경우 모든 JWT 속성을 사용자 클레임으로 사용할 수 있습니다.

여기에 표시된 가장 흥미로운 정책은 사용자 지정 권한 부여 요구 사항을 사용하기 때문에 세 번째 AddPolicy 방법입니다. 사용자 지정 권한 부여 요구 사항을 사용하면 권한 부여가 수행되는 방식을 크게 제어할 수 있습니다. 이렇게 하려면 다음 형식을 구현해야 합니다.

  • 요구 사항의 세부 정보를 지정하는 필드를 포함하고 IAuthorizationRequirement에서 파생된 요구 사항 형식입니다. 이 예제에서는 샘플 MinimumAgeRequirement 형식의 연령 필드입니다.

  • 처리기가 충족할 수 있는 형식 AuthorizationHandler<TRequirement>의 T를 구현하는 IAuthorizationRequirement 처리기입니다. 처리기는 사용자에 HandleRequirementAsync 대한 정보를 포함하는 지정된 컨텍스트가 요구 사항을 충족하는지 여부를 확인하는 메서드를 구현해야 합니다.

사용자가 요구 사항을 충족하는 경우 호출 context.Succeed 은 사용자에게 권한이 있음을 나타냅니다. 사용자가 권한 부여 요구 사항을 충족하는 여러 가지 방법이 있는 경우 여러 처리기를 만들 수 있습니다.

호출에 사용자 지정 정책 요구 사항을 AddPolicy 등록하는 것 외에도 종속성 주입(services.AddTransient<IAuthorizationHandler, MinimumAgeHandler>())을 통해 사용자 지정 요구 사항 처리기를 등록해야 합니다.

클레임에 DateOfBirth 따라 사용자의 나이를 확인하기 위한 사용자 지정 권한 부여 요구 사항 및 처리기의 예는 ASP.NET Core 권한 부여 설명서에서 확인할 수 있습니다.

권한 부여 및 최소 API

ASP.NET 컨트롤러 기반 API 대신 최소 API를 지원합니다. 권한 부여 정책은 다음 예제와 같이 최소 API에 대한 권한 부여를 구성하는 권장 방법입니다.

// Program.cs
builder.Services.AddAuthorizationBuilder()
  .AddPolicy("admin_greetings", policy =>
        policy
            .RequireRole("admin")
            .RequireScope("greetings_api"));

// build the app

app.MapGet("/hello", () => "Hello world!")
  .RequireAuthorization("admin_greetings");

추가 리소스