ASP.NET Core의 클레임 기반 권한 부여

ID가 생성되면 신뢰할 수 있는 당사자가 발급한 하나 이상의 클레임이 할당될 수 있습니다. 클레임은 주체가 수행할 수 있는 작업이 아니라 주체의 정의를 나타내는 이름 값 쌍입니다. 예를 들어, 지역 운전면허 기관에서 발급한 운전면허증이 있을 수 있습니다. 운전면허증에 생년월일이 적혀 있습니다. 이 경우 클레임 이름은 DateOfBirth이고 클레임 값은 생년월일입니다. 예를 들어 8th June 1970이며 발급자가 운전면허 기관이 됩니다. 클레임 기반 권한 부여는 가장 간단하게 클레임 값을 검사 해당 값에 따라 리소스에 대한 액세스를 허용합니다. 예를 들어 야간 클럽에 액세스하려는 경우 권한 부여 프로세스는 다음과 같을 수 있습니다.

도어 보안 책임자는 액세스 권한을 부여하기 전에 생년월일 클레임의 값과 발급자(운전면허 기관)를 신뢰하는지 여부를 평가합니다.

ID는 여러 개의 값이 있는 여러 클레임을 포함할 수 있으며, 동일한 유형의 클레임을 여러 개 포함할 수 있습니다.

클레임 확인 추가

클레임 기반 권한 부여 검사:

  • 선언적입니다.
  • Razor 페이지, 컨트롤러, 컨트롤러 내 작업에 적용됩니다.
  • 페이지에 반드시 적용되어야 하며 Razor 페이지 처리기 수준에서는 적용될 수 없습니다.

코드의 클레임은 현재 사용자가 소유해야 하는 클레임을 지정하고, 필요에 따라 요청된 리소스에 액세스하기 위해 클레임이 보유해야 하는 값을 지정합니다. 클레임 요구 사항은 정책 기반입니다. 개발자는 클레임 요구 사항을 나타내는 정책을 빌드하고 등록해야 합니다.

가장 간단한 유형의 클레임 정책은 클레임의 존재를 찾고 값을 확인하지 않습니다.

정책을 빌드 및 등록하고 UseAuthorization을 호출합니다. 정책 등록은 일반적으로 파일에서 권한 부여 서비스 구성의 Program.cs 일부로 수행됩니다.

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();

builder.Services.AddAuthorization(options =>
{
   options.AddPolicy("EmployeeOnly", policy => policy.RequireClaim("EmployeeNumber"));
});

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseAuthentication();
app.UseAuthorization();

app.MapDefaultControllerRoute();
app.MapRazorPages();

app.Run();

이 경우 EmployeeOnly 정책은 현재 ID에 EmployeeNumber 클레임이 있는지 확인합니다.

특성의 Policy 속성을 [Authorize] 사용하여 정책을 적용하여 정책 이름을 지정합니다.

[Authorize(Policy = "EmployeeOnly")]
public IActionResult VacationBalance()
{
    return View();
}

특성은 [Authorize] 전체 컨트롤러 또는 Razor 페이지에 적용할 수 있습니다. 이 경우 정책과 일치하는 ID만 컨트롤러의 모든 작업에 액세스할 수 있습니다.

[Authorize(Policy = "EmployeeOnly")]
public class VacationController : Controller
{
    public IActionResult Index()
    {
        return View();
    }

    public ActionResult VacationBalance()
    {
        return View();
    }

    [AllowAnonymous]
    public ActionResult VacationPolicy()
    {
        return View();
    }
}

다음 코드는 Razor 페이지에 [Authorize] 특성을 적용합니다.

[Authorize(Policy = "EmployeeOnly")]
public class IndexModel : PageModel
{
    public void OnGet()
    {

    }
}

정책은 Razor 페이지 처리기 수준에서 적용될 수 없고, 페이지에 적용하여야 합니다.

특성으로 보호되지만 [Authorize] 특정 작업에 대한 익명 액세스를 허용하려는 컨트롤러가 있는 경우 특성을 적용 AllowAnonymousAttribute 합니다.

[Authorize(Policy = "EmployeeOnly")]
public class VacationController : Controller
{
    public IActionResult Index()
    {
        return View();
    }

    public ActionResult VacationBalance()
    {
        return View();
    }

    [AllowAnonymous]
    public ActionResult VacationPolicy()
    {
        return View();
    }
}

Razor 페이지 처리기 수준에서는 정책을 적용할 수 없기 때문에, 페이지 처리기 수준에서 정책을 적용하여야 하는 경우 컨트롤러 사용이 권장됩니다. Razor 페이지 처리기 수준에서 정책이 필요하지 않은 나머지 앱은 Razor 페이지에서 사용할 수 있습니다.

대부분의 클레임에는 값이 제공됩니다. 정책을 만들 때 허용되는 값 목록을 지정할 수 있습니다. 다음 예제에서는 직원 수가 1, 2, 3, 4 또는 5인 직원에게만 성공합니다.

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();

builder.Services.AddAuthorization(options =>
{
    options.AddPolicy("Founders", policy =>
                      policy.RequireClaim("EmployeeNumber", "1", "2", "3", "4", "5"));
});

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseAuthentication();
app.UseAuthorization();

app.MapDefaultControllerRoute();
app.MapRazorPages();

app.Run();

일반 클레임 검사 추가

클레임 값이 단일 값이 아니거나 변환이 필요한 경우 .RequireAssertion 자세한 내용은 함수를 사용하여 정책 수행을 참조하세요.

여러 정책 평가

컨트롤러 및 작업 수준에서 여러 정책을 적용하는 경우 액세스 권한이 부여되기 전에 모든 정책을 통과해야 합니다.

[Authorize(Policy = "EmployeeOnly")]
public class SalaryController : Controller
{
    public IActionResult Index()
    {
        return View();
    }

    public IActionResult Payslip()
    {
        return View();
    }

    [Authorize(Policy = "HumanResources")]
    public IActionResult UpdateSalary()
    {
        return View();
    }
}

상기 예제에서 EmployeeOnly 정책에 부합하는 ID 만이 Payslip 작업에 액세스할 수 있는데, 정책이 컨트롤러에 적용되었기 때문입니다. 그러나 작업을 호출 UpdateSalary 하려면 ID가 정책과 정책을 HumanResources 모두EmployeeOnly 충족해야 합니다.

생년월일을 지정하고 나이를 계산한 다음 연령이 21세 이상임을 검사 등 더 복잡한 정책을 원하는 경우 사용자 지정 정책 처리기를 작성해야 합니다.

다음 샘플에서 두 페이지 처리기 메서드는 정책과 정책을 HumanResources 모두EmployeeOnly 충족해야 합니다.

[Authorize(Policy = "EmployeeOnly")]
[Authorize(Policy = "HumanResources")]
public class SalaryModel : PageModel
{
    public ContentResult OnGetPayStub()
    {
        return Content("OnGetPayStub");
    }

    public ContentResult OnGetSalary()
    {
        return Content("OnGetSalary");
    }
}

ID가 생성되면 신뢰할 수 있는 당사자가 발급한 하나 이상의 클레임이 할당될 수 있습니다. 클레임은 주체가 수행할 수 있는 작업이 아니라 주체의 정의를 나타내는 이름 값 쌍입니다. 예를 들어, 지역 운전면허 기관에서 발급한 운전면허증이 있을 수 있습니다. 운전면허증에 생년월일이 적혀 있습니다. 이 경우 클레임 이름은 DateOfBirth이고 클레임 값은 생년월일입니다. 예를 들어 8th June 1970이며 발급자가 운전면허 기관이 됩니다. 클레임 기반 권한 부여는 가장 간단하게 클레임 값을 검사 해당 값에 따라 리소스에 대한 액세스를 허용합니다. 예를 들어 야간 클럽에 액세스하려는 경우 권한 부여 프로세스는 다음과 같을 수 있습니다.

도어 보안 책임자는 액세스 권한을 부여하기 전에 생년월일 클레임의 값과 발급자(운전면허 기관)를 신뢰하는지 여부를 평가합니다.

ID는 여러 개의 값이 있는 여러 클레임을 포함할 수 있으며, 동일한 유형의 클레임을 여러 개 포함할 수 있습니다.

클레임 확인 추가

클레임 기반 권한 부여 검사 선언적입니다. 개발자는 현재 사용자가 소유해야 하는 클레임을 지정하고 필요에 따라 요청된 리소스에 액세스하기 위해 클레임이 보유해야 하는 값을 지정하여 컨트롤러 또는 컨트롤러 내의 작업에 대해 코드 내에 포함합니다. 클레임 요구 사항은 정책 기반이므로 개발자는 클레임 요구 사항을 나타내는 정책을 작성하고 등록해야 합니다.

가장 간단한 유형의 클레임 정책은 클레임의 존재를 찾고 값을 확인하지 않습니다.

정책을 빌드하고 등록합니다. 이는 일반적으로 파일에 참여하는 ConfigureServices() 권한 부여 서비스 구성의 Startup.cs 일부로 수행됩니다.

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllersWithViews();
    services.AddRazorPages();

    services.AddAuthorization(options =>
    {
        options.AddPolicy("EmployeeOnly", policy => policy.RequireClaim("EmployeeNumber"));
    });
}

UseAuthorization에서 Configure를 호출합니다. ASP.NET Core 웹앱 템플릿에서 생성되는 코드는 다음과 같습니다.

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
        app.UseMigrationsEndPoint();
    }
    else
    {
        app.UseExceptionHandler("/Error");
        app.UseHsts();
    }

    app.UseHttpsRedirection();
    app.UseStaticFiles();

    app.UseRouting();

    app.UseAuthentication();
    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapRazorPages();
    });
}

이 경우 EmployeeOnly 정책은 현재 ID에 EmployeeNumber 클레임이 있는지 확인합니다.

그런 다음, [Authorize] 특성의 Policy 속성을 사용하여 정책을 적용하여 정책 이름을 지정합니다.

[Authorize(Policy = "EmployeeOnly")]
public IActionResult VacationBalance()
{
    return View();
}

[Authorize] 특성은 전체 컨트롤러에 적용할 수 있습니다. 이 경우 정책과 일치하는 ID만 컨트롤러의 모든 작업에 액세스할 수 있습니다.

[Authorize(Policy = "EmployeeOnly")]
public class VacationController : Controller
{
    public ActionResult VacationBalance()
    {
    }
}

[Authorize] 특성으로 보호되는 컨트롤러가 있지만 특정 작업에 대한 익명 액세스를 허용하려는 경우에는 AllowAnonymousAttribute 특성을 적용합니다.

[Authorize(Policy = "EmployeeOnly")]
public class VacationController : Controller
{
    public ActionResult VacationBalance()
    {
    }

    [AllowAnonymous]
    public ActionResult VacationPolicy()
    {
    }
}

대부분의 클레임에는 값이 제공됩니다. 정책을 만들 때 허용되는 값 목록을 지정할 수 있습니다. 다음 예제는 직원 번호가 1, 2, 3, 4 또는 5인 직원에게만 성공합니다.

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllersWithViews();
    services.AddRazorPages();

    services.AddAuthorization(options =>
    {
        options.AddPolicy("Founders", policy =>
                          policy.RequireClaim("EmployeeNumber", "1", "2", "3", "4", "5"));
    });
}

일반 클레임 검사 추가

클레임 값이 단일 값이 아니거나 변환이 필요한 경우 .RequireAssertion 자세한 내용은 함수를 사용하여 정책 수행을 참조하세요.

여러 정책 평가

컨트롤러 또는 작업에 정책을 여러 개 적용하는 경우 액세스가 부여되기 전에 모든 정책이 통과해야 합니다. 예시:

[Authorize(Policy = "EmployeeOnly")]
public class SalaryController : Controller
{
    public ActionResult Payslip()
    {
    }

    [Authorize(Policy = "HumanResources")]
    public ActionResult UpdateSalary()
    {
    }
}

위의 예제에서 EmployeeOnly 정책을 충족하는 모든 ID는 컨트롤러에서 정책이 적용될 때 Payslip 작업에 액세스할 수 있습니다. 그러나 UpdateSalary 작업을 호출하기 위해 ID는 EmployeeOnly 정책과 HumanResources 정책을 모두 충족해야 합니다.

생년월일 클레임을 사용하고, 해당 나이를 계산한 다음, 나이가 21살이거나 사용자보다 많은지 확인하는 것과 같이 더 복잡한 정책을 원하는 경우에는 사용자 지정 정책 처리기를 작성해야 합니다.

ID가 생성되면 신뢰할 수 있는 당사자가 발급한 하나 이상의 클레임이 할당될 수 있습니다. 클레임은 주체가 수행할 수 있는 작업이 아니라 주체의 정의를 나타내는 이름 값 쌍입니다. 예를 들어, 지역 운전면허 기관에서 발급한 운전면허증이 있을 수 있습니다. 운전면허증에 생년월일이 적혀 있습니다. 이 경우 클레임 이름은 DateOfBirth이고 클레임 값은 생년월일입니다. 예를 들어 8th June 1970이며 발급자가 운전면허 기관이 됩니다. 클레임 기반 권한 부여는 가장 간단하게 클레임 값을 검사 해당 값에 따라 리소스에 대한 액세스를 허용합니다. 예를 들어 야간 클럽에 액세스하려는 경우 권한 부여 프로세스는 다음과 같을 수 있습니다.

도어 보안 책임자는 액세스 권한을 부여하기 전에 생년월일 클레임의 값과 발급자(운전면허 기관)를 신뢰하는지 여부를 평가합니다.

ID는 여러 개의 값이 있는 여러 클레임을 포함할 수 있으며, 동일한 유형의 클레임을 여러 개 포함할 수 있습니다.

클레임 확인 추가

클레임 기반 권한 부여 검사 선언적입니다. 개발자는 현재 사용자가 소유해야 하는 클레임을 지정하고 필요에 따라 요청된 리소스에 액세스하기 위해 클레임이 보유해야 하는 값을 지정하여 컨트롤러 또는 컨트롤러 내의 작업에 대해 코드 내에 포함합니다. 클레임 요구 사항은 정책 기반이므로 개발자는 클레임 요구 사항을 나타내는 정책을 작성하고 등록해야 합니다.

가장 간단한 유형의 클레임 정책은 클레임의 존재를 찾고 값을 확인하지 않습니다.

정책을 빌드하고 등록합니다. 이는 일반적으로 파일에 참여하는 ConfigureServices() 권한 부여 서비스 구성의 Startup.cs 일부로 수행됩니다.

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllersWithViews();
    services.AddRazorPages();

    services.AddAuthorization(options =>
    {
        options.AddPolicy("EmployeeOnly", policy => policy.RequireClaim("EmployeeNumber"));
    });
}

이 경우 EmployeeOnly 정책은 현재 ID에 EmployeeNumber 클레임이 있는지 확인합니다.

그런 다음, [Authorize] 특성의 Policy 속성을 사용하여 정책을 적용하여 정책 이름을 지정합니다.

[Authorize(Policy = "EmployeeOnly")]
public IActionResult VacationBalance()
{
    return View();
}

[Authorize] 특성은 전체 컨트롤러에 적용할 수 있습니다. 이 경우 정책과 일치하는 ID만 컨트롤러의 모든 작업에 액세스할 수 있습니다.

[Authorize(Policy = "EmployeeOnly")]
public class VacationController : Controller
{
    public ActionResult VacationBalance()
    {
    }
}

[Authorize] 특성으로 보호되는 컨트롤러가 있지만 특정 작업에 대한 익명 액세스를 허용하려는 경우에는 AllowAnonymousAttribute 특성을 적용합니다.

[Authorize(Policy = "EmployeeOnly")]
public class VacationController : Controller
{
    public ActionResult VacationBalance()
    {
    }

    [AllowAnonymous]
    public ActionResult VacationPolicy()
    {
    }
}

대부분의 클레임에는 값이 제공됩니다. 정책을 만들 때 허용되는 값 목록을 지정할 수 있습니다. 다음 예제는 직원 번호가 1, 2, 3, 4 또는 5인 직원에게만 성공합니다.

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllersWithViews();
    services.AddRazorPages();

    services.AddAuthorization(options =>
    {
        options.AddPolicy("Founders", policy =>
                          policy.RequireClaim("EmployeeNumber", "1", "2", "3", "4", "5"));
    });
}

일반 클레임 검사 추가

클레임 값이 단일 값이 아니거나 변환이 필요한 경우 .RequireAssertion 자세한 내용은 함수를 사용하여 정책 수행을 참조하세요.

여러 정책 평가

컨트롤러 또는 작업에 정책을 여러 개 적용하는 경우 액세스가 부여되기 전에 모든 정책이 통과해야 합니다. 예시:

[Authorize(Policy = "EmployeeOnly")]
public class SalaryController : Controller
{
    public ActionResult Payslip()
    {
    }

    [Authorize(Policy = "HumanResources")]
    public ActionResult UpdateSalary()
    {
    }
}

위의 예제에서 EmployeeOnly 정책을 충족하는 모든 ID는 컨트롤러에서 정책이 적용될 때 Payslip 작업에 액세스할 수 있습니다. 그러나 UpdateSalary 작업을 호출하기 위해 ID는 EmployeeOnly 정책과 HumanResources 정책을 모두 충족해야 합니다.

생년월일 클레임을 사용하고, 해당 나이를 계산한 다음, 나이가 21살이거나 사용자보다 많은지 확인하는 것과 같이 더 복잡한 정책을 원하는 경우에는 사용자 지정 정책 처리기를 작성해야 합니다.