Bagikan melalui


Otorisasi berbasis klaim di ASP.NET Core

Ketika identitas dibuat, identitas dapat ditetapkan satu atau beberapa klaim yang dikeluarkan oleh pihak tepercaya. Klaim adalah pasangan nilai nama yang mewakili siapa subjeknya, bukan yang dapat dilakukan subjek tersebut. Misalnya, Anda mungkin memiliki SIM, yang dikeluarkan oleh otoritas SIM lokal. SIM Anda memiliki tanggal lahir Anda di atasnya. Dalam hal ini nama klaim adalah DateOfBirth, nilai klaim adalah tanggal lahir Anda, misalnya 8th June 1970 dan penerbit akan menjadi otoritas lisensi mengemudi. Otorisasi berbasis klaim, yang paling sederhana, memeriksa nilai klaim dan memungkinkan akses ke sumber daya berdasarkan nilai tersebut. Misalnya jika Anda ingin akses ke klub malam, proses otorisasi mungkin:

Petugas keamanan pintu akan mengevaluasi nilai klaim tanggal lahir Anda dan apakah mereka mempercayai penerbit (otoritas SIM) sebelum memberi Anda akses.

Identitas dapat berisi beberapa klaim dengan beberapa nilai dan dapat berisi beberapa klaim dengan jenis yang sama.

Menambahkan pemeriksaan klaim

Pemeriksaan otorisasi berbasis klaim:

  • Bersifat deklaratif.
  • Diterapkan ke Razor Halaman, pengontrol, atau tindakan dalam pengontrol.
  • Tidak dapat diterapkan di Razor tingkat handler Halaman, mereka harus diterapkan ke Halaman.

Klaim dalam kode menentukan klaim yang harus dimiliki pengguna saat ini, dan secara opsional nilai yang harus ditangguhkan klaim untuk mengakses sumber daya yang diminta. Persyaratan klaim berbasis kebijakan; pengembang harus membangun dan mendaftarkan kebijakan yang mengekspresikan persyaratan klaim.

Jenis kebijakan klaim yang paling sederhana mencari keberadaan klaim dan tidak memeriksa nilainya.

Bangun dan daftarkan kebijakan dan panggil UseAuthorization. Mendaftarkan kebijakan terjadi sebagai bagian dari konfigurasi layanan Otorisasi, biasanya dalam Program.cs file:

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();

Dalam hal EmployeeOnly ini kebijakan memeriksa keberadaan EmployeeNumber klaim pada identitas saat ini.

Terapkan kebijakan menggunakan Policy properti pada [Authorize] atribut untuk menentukan nama kebijakan.

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

Atribut [Authorize] dapat diterapkan ke seluruh pengontrol atau Razor Halaman, dalam hal ini hanya identitas yang cocok dengan kebijakan yang diizinkan mengakses Tindakan apa pun pada pengontrol.

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

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

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

Kode berikut menerapkan atribut ke [Authorize]Razor Halaman:

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

    }
}

Kebijakan tidak dapat diterapkan di Razor tingkat handler Halaman, kebijakan tersebut harus diterapkan ke Halaman.

Jika Anda memiliki pengontrol yang dilindungi oleh [Authorize] atribut tetapi ingin mengizinkan akses anonim ke tindakan tertentu, Anda menerapkan AllowAnonymousAttribute atribut .

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

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

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

Karena kebijakan tidak dapat diterapkan di Razor tingkat handler Halaman, sebaiknya gunakan pengontrol ketika kebijakan harus diterapkan di tingkat handler halaman. Aplikasi lainnya yang tidak memerlukan kebijakan di Razor tingkat handler Halaman dapat menggunakan Razor Pages.

Sebagian besar klaim datang dengan nilai. Anda dapat menentukan daftar nilai yang diizinkan saat membuat kebijakan. Contoh berikut hanya akan berhasil untuk karyawan yang jumlah karyawannya adalah 1, 2, 3, 4, atau 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();

Menambahkan pemeriksaan klaim generik

Jika nilai klaim bukan nilai tunggal atau transformasi diperlukan, gunakan RequireAssertion. Untuk informasi selengkapnya, lihat Menggunakan func untuk memenuhi kebijakan.

Evaluasi Beberapa Kebijakan

Jika beberapa kebijakan diterapkan di tingkat pengontrol dan tindakan, semua kebijakan harus diteruskan sebelum akses diberikan:

[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();
    }
}

Dalam contoh sebelumnya, identitas apa pun yang memenuhi EmployeeOnly kebijakan dapat mengakses Payslip tindakan saat kebijakan tersebut diberlakukan pada pengontrol. Namun, untuk memanggil UpdateSalary tindakan, identitas harus memenuhi EmployeeOnly kebijakan dan HumanResources kebijakan.

Jika Anda menginginkan kebijakan yang lebih rumit, seperti mengambil klaim tanggal lahir, menghitung usia darinya, dan kemudian memeriksa bahwa usianya adalah 21 atau lebih, maka Anda perlu menulis penangan kebijakan kustom.

Dalam sampel berikut, kedua metode penangan halaman harus memenuhi EmployeeOnly kebijakan dan HumanResources kebijakan:

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

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

Ketika identitas dibuat, identitas dapat ditetapkan satu atau beberapa klaim yang dikeluarkan oleh pihak tepercaya. Klaim adalah pasangan nilai nama yang mewakili siapa subjeknya, bukan yang dapat dilakukan subjek tersebut. Misalnya, Anda mungkin memiliki SIM, yang dikeluarkan oleh otoritas SIM lokal. SIM Anda memiliki tanggal lahir Anda di atasnya. Dalam hal ini nama klaim adalah DateOfBirth, nilai klaim adalah tanggal lahir Anda, misalnya 8th June 1970 dan penerbit akan menjadi otoritas lisensi mengemudi. Otorisasi berbasis klaim, yang paling sederhana, memeriksa nilai klaim dan memungkinkan akses ke sumber daya berdasarkan nilai tersebut. Misalnya jika Anda ingin akses ke klub malam, proses otorisasi mungkin:

Petugas keamanan pintu akan mengevaluasi nilai klaim tanggal lahir Anda dan apakah mereka mempercayai penerbit (otoritas SIM) sebelum memberi Anda akses.

Identitas dapat berisi beberapa klaim dengan beberapa nilai dan dapat berisi beberapa klaim dengan jenis yang sama.

Menambahkan pemeriksaan klaim

Pemeriksaan otorisasi berbasis klaim bersifat deklaratif - pengembang menyematkannya dalam kode mereka, terhadap pengontrol atau tindakan dalam pengontrol, menentukan klaim yang harus dimiliki pengguna saat ini, dan secara opsional nilai yang harus dimiliki klaim untuk mengakses sumber daya yang diminta. Persyaratan klaim berbasis kebijakan, pengembang harus membangun dan mendaftarkan kebijakan yang mengekspresikan persyaratan klaim.

Jenis kebijakan klaim yang paling sederhana mencari keberadaan klaim dan tidak memeriksa nilainya.

Bangun dan daftarkan kebijakan. Ini terjadi sebagai bagian dari konfigurasi layanan Otorisasi, yang biasanya mengambil bagian dalam ConfigureServices() file Anda Startup.cs .

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

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

Panggil UseAuthorization di Configure. Kode berikut dihasilkan oleh templat aplikasi web 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();
    });
}

Dalam hal EmployeeOnly ini kebijakan memeriksa keberadaan EmployeeNumber klaim pada identitas saat ini.

Anda kemudian menerapkan kebijakan menggunakan Policy properti pada [Authorize] atribut untuk menentukan nama kebijakan;

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

Atribut [Authorize] dapat diterapkan ke seluruh pengontrol, dalam hal ini hanya identitas yang cocok dengan kebijakan yang akan diizinkan mengakses Tindakan apa pun pada pengontrol.

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

Jika Anda memiliki pengontrol yang dilindungi oleh [Authorize] atribut , tetapi ingin mengizinkan akses anonim ke tindakan tertentu, Anda menerapkan AllowAnonymousAttribute atribut .

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

    [AllowAnonymous]
    public ActionResult VacationPolicy()
    {
    }
}

Sebagian besar klaim datang dengan nilai. Anda dapat menentukan daftar nilai yang diizinkan saat membuat kebijakan. Contoh berikut hanya akan berhasil untuk karyawan yang jumlah karyawannya adalah 1, 2, 3, 4 atau 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"));
    });
}

Menambahkan pemeriksaan klaim generik

Jika nilai klaim bukan nilai tunggal atau transformasi diperlukan, gunakan RequireAssertion. Untuk informasi selengkapnya, lihat Menggunakan func untuk memenuhi kebijakan.

Evaluasi Beberapa Kebijakan

Jika Anda menerapkan beberapa kebijakan ke pengontrol atau tindakan, semua kebijakan harus diteruskan sebelum akses diberikan. Contohnya:

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

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

Dalam contoh di atas, identitas apa pun yang memenuhi EmployeeOnly kebijakan dapat mengakses Payslip tindakan saat kebijakan tersebut diberlakukan pada pengontrol. Namun untuk memanggil UpdateSalary tindakan, identitas harus memenuhi EmployeeOnly kebijakan dan HumanResources kebijakan.

Jika Anda menginginkan kebijakan yang lebih rumit, seperti mengambil klaim tanggal lahir, menghitung usia darinya, maka memeriksa usia adalah 21 atau lebih lama maka Anda perlu menulis penangan kebijakan kustom.

Ketika identitas dibuat, identitas dapat ditetapkan satu atau beberapa klaim yang dikeluarkan oleh pihak tepercaya. Klaim adalah pasangan nilai nama yang mewakili siapa subjeknya, bukan yang dapat dilakukan subjek tersebut. Misalnya, Anda mungkin memiliki SIM, yang dikeluarkan oleh otoritas SIM lokal. SIM Anda memiliki tanggal lahir Anda di atasnya. Dalam hal ini nama klaim adalah DateOfBirth, nilai klaim adalah tanggal lahir Anda, misalnya 8th June 1970 dan penerbit akan menjadi otoritas lisensi mengemudi. Otorisasi berbasis klaim, yang paling sederhana, memeriksa nilai klaim dan memungkinkan akses ke sumber daya berdasarkan nilai tersebut. Misalnya jika Anda ingin akses ke klub malam, proses otorisasi mungkin:

Petugas keamanan pintu akan mengevaluasi nilai klaim tanggal lahir Anda dan apakah mereka mempercayai penerbit (otoritas SIM) sebelum memberi Anda akses.

Identitas dapat berisi beberapa klaim dengan beberapa nilai dan dapat berisi beberapa klaim dengan jenis yang sama.

Menambahkan pemeriksaan klaim

Pemeriksaan otorisasi berbasis klaim bersifat deklaratif - pengembang menyematkannya dalam kode mereka, terhadap pengontrol atau tindakan dalam pengontrol, menentukan klaim yang harus dimiliki pengguna saat ini, dan secara opsional nilai yang harus dimiliki klaim untuk mengakses sumber daya yang diminta. Persyaratan klaim berbasis kebijakan, pengembang harus membangun dan mendaftarkan kebijakan yang mengekspresikan persyaratan klaim.

Jenis kebijakan klaim yang paling sederhana mencari keberadaan klaim dan tidak memeriksa nilainya.

Bangun dan daftarkan kebijakan. Ini terjadi sebagai bagian dari konfigurasi layanan Otorisasi, yang biasanya mengambil bagian dalam ConfigureServices() file Anda Startup.cs .

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

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

Dalam hal EmployeeOnly ini kebijakan memeriksa keberadaan EmployeeNumber klaim pada identitas saat ini.

Anda kemudian menerapkan kebijakan menggunakan Policy properti pada [Authorize] atribut untuk menentukan nama kebijakan;

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

Atribut [Authorize] dapat diterapkan ke seluruh pengontrol, dalam hal ini hanya identitas yang cocok dengan kebijakan yang akan diizinkan mengakses Tindakan apa pun pada pengontrol.

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

Jika Anda memiliki pengontrol yang dilindungi oleh [Authorize] atribut , tetapi ingin mengizinkan akses anonim ke tindakan tertentu, Anda menerapkan AllowAnonymousAttribute atribut .

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

    [AllowAnonymous]
    public ActionResult VacationPolicy()
    {
    }
}

Sebagian besar klaim datang dengan nilai. Anda dapat menentukan daftar nilai yang diizinkan saat membuat kebijakan. Contoh berikut hanya akan berhasil untuk karyawan yang jumlah karyawannya adalah 1, 2, 3, 4 atau 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"));
    });
}

Menambahkan pemeriksaan klaim generik

Jika nilai klaim bukan nilai tunggal atau transformasi diperlukan, gunakan RequireAssertion. Untuk informasi selengkapnya, lihat Menggunakan func untuk memenuhi kebijakan.

Evaluasi Beberapa Kebijakan

Jika Anda menerapkan beberapa kebijakan ke pengontrol atau tindakan, semua kebijakan harus diteruskan sebelum akses diberikan. Contohnya:

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

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

Dalam contoh di atas, identitas apa pun yang memenuhi EmployeeOnly kebijakan dapat mengakses Payslip tindakan saat kebijakan tersebut diberlakukan pada pengontrol. Namun untuk memanggil UpdateSalary tindakan, identitas harus memenuhi EmployeeOnly kebijakan dan HumanResources kebijakan.

Jika Anda menginginkan kebijakan yang lebih rumit, seperti mengambil klaim tanggal lahir, menghitung usia darinya, maka memeriksa usia adalah 21 atau lebih lama maka Anda perlu menulis penangan kebijakan kustom.