다음을 통해 공유


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

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

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

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

클레임 확인 추가

클레임 기반 권한 부여 확인:

  • 선언적입니다.
  • 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 정책은 현재 identity클레임이 있는지 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 페이지 처리기 수준에서는 정책을 적용할 수 없기 때문에, 페이지 처리기 수준에서 정책을 적용하여야 하는 경우 컨트롤러 사용이 권장됩니다. rest 페이지 처리기 수준에서 정책이 필요하지 않은 앱은 Pages를 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 모든 identity 정책은 해당 정책이 컨트롤러에 Payslip 적용될 때 작업에 액세스할 수 있습니다. 그러나 작업을 호출 UpdateSalary 하려면 정책과 정책을 HumanResources 모두 EmployeeOnly 수행해야 identity 합니다.

생년월일을 지정하고 나이를 계산한 다음 연령이 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");
    }
}

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

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

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

클레임 확인 추가

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

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

정책을 빌드하고 등록합니다. 이는 일반적으로 파일에 참여하는 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 정책은 현재 identity클레임이 있는지 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 모든 identity 항목은 해당 정책이 컨트롤러에 Payslip 적용될 때 작업에 액세스할 수 있습니다. 그러나 작업을 호출 UpdateSalary 하려면 정책과 정책을 HumanResources 모두 EmployeeOnly 수행해야 identity 합니다.

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

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

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

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

클레임 확인 추가

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

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

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

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

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

이 경우 EmployeeOnly 정책은 현재 identity클레임이 있는지 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 모든 identity 항목은 해당 정책이 컨트롤러에 Payslip 적용될 때 작업에 액세스할 수 있습니다. 그러나 작업을 호출 UpdateSalary 하려면 정책과 정책을 HumanResources 모두 EmployeeOnly 수행해야 identity 합니다.

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