Bagikan melalui


Tentang otorisasi dalam layanan mikro .NET dan aplikasi web

Tip

Konten ini adalah kutipan dari eBook, .NET Microservices Architecture for Containerized .NET Applications, tersedia di .NET Docs atau sebagai PDF yang dapat diunduh gratis dan dapat dibaca secara offline.

.NET Microservices Architecture for Containerized .NET Applications eBook cover thumbnail.

Setelah autentikasi, ASP.NET Core Web API harus mengotorisasi akses. Proses ini memungkinkan layanan untuk membuat API tersedia untuk beberapa pengguna yang diautentikasi, tetapi tidak untuk semua. Otorisasi dapat dilakukan berdasarkan peran pengguna atau berdasarkan kebijakan kustom yang mungkin termasuk memeriksa klaim atau heuristik lainnya.

Membatasi akses ke rute MVC Inti ASP.NET semudah menerapkan atribut Otorisasi ke metode tindakan (atau ke kelas pengontrol jika semua tindakan pengontrol memerlukan otorisasi), seperti yang ditunjukkan dalam contoh berikut:

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

    [Authorize]
    public ActionResult Logout()
    {
    }
}

Menambahkan atribut Otorisasi tanpa parameter akan secara default membatasi akses ke pengguna yang diautentikasi untuk pengontrol atau tindakan tersebut. Untuk lebih membatasi API agar tersedia hanya untuk pengguna tertentu, atribut dapat diperluas untuk menentukan peran atau kebijakan wajib yang harus dipenuhi pengguna.

Menerapkan otorisasi berbasis peran

Identitas Inti ASP.NET memiliki konsep peran bawaan. Selain pengguna, Identitas Inti ASP.NET menyimpan informasi tentang berbagai peran yang digunakan oleh aplikasi dan melacak pengguna mana yang ditetapkan untuk peran tersebut. Penetapan ini dapat diubah secara terprogram dengan jenis RoleManager yang memperbarui peran dalam penyimpanan tetap, dan jenis UserManager yang dapat memberikan atau mencabut peran dari pengguna.

Jika Anda mengautentikasi dengan token pembawa JWT, middleware autentikasi pembawa JWT Inti ASP.NET akan mengisi peran pengguna berdasarkan klaim peran yang ditemukan dalam token. Untuk membatasi akses ke tindakan atau pengontrol MVC ke pengguna dalam peran tertentu, Anda dapat menyertakan parameter Peran dalam anotasi (atribut) Otorisasi, seperti yang ditunjukkan dalam fragmen kode berikut:

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

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

Dalam contoh ini, pengguna dalam peran Administrator atau PowerUser saja yang dapat mengakses API di pengontrol ControlPanel (seperti menjalankan tindakan SetTime). API SHUTDown dibatasi lebih lanjut untuk mengizinkan akses hanya kepada pengguna dalam peran Administrator.

Untuk mengharuskan pengguna berada dalam beberapa peran, Anda harus menggunakan beberapa atribut Otorisasi, seperti yang ditunjukkan dalam contoh berikut:

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

Dalam contoh ini, untuk memanggil API1, pengguna harus:

  • Berada dalam peran Administrator atau PowerUser, dan

  • Berada dalam peran RemoteEmployee, dan

  • Memenuhi penanganan kustom untuk otorisasi CustomPolicy.

Menerapkan otorisasi berbasis kebijakan menggunakan klaim

Aturan otorisasi kustom juga dapat ditulis menggunakan kebijakan otorisasi. Bagian ini memberikan gambaran umum. Untuk informasi selengkapnya, lihat Lokakarya Otorisasi ASP.NET.

Kebijakan otorisasi kustom didaftarkan dalam metode Startup.ConfigureServices menggunakan metode service.AddAuthorization. Metode ini mengambil delegasi yang mengonfigurasi argumen 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)));
});

Seperti yang ditunjukkan dalam contoh, kebijakan dapat dikaitkan dengan berbagai jenis persyaratan. Setelah kebijakan didaftarkan, kebijakan dapat diterapkan ke tindakan atau pengontrol dengan meneruskan nama kebijakan sebagai argumen Azure Policy dari atribut Otorisasi (misalnya, [Authorize(Policy="EmployeesOnly")]) Kebijakan dapat memiliki beberapa persyaratan, bukan hanya satu (seperti yang ditunjukkan dalam contoh ini).

Pada contoh sebelumnya, panggilan AddPolicy pertama hanyalah cara alternatif untuk otorisasi berdasarkan peran. Jika [Authorize(Policy="AdministratorsOnly")] diterapkan ke API, hanya pengguna dalam peran Administrator yang dapat mengaksesnya.

Panggilan AddPolicy kedua menunjukkan cara mudah untuk mengharuskan klaim tertentu harus ada untuk pengguna. Metode RequireClaim juga secara opsional mengambil nilai yang diharapkan untuk klaim. Jika nilai ditentukan, persyaratan dipenuhi hanya jika pengguna memiliki klaim dengan jenis yang benar dan salah satu dari nilai yang ditentukan. Jika Anda menggunakan middleware autentikasi pembawa JWT, semua properti JWT akan tersedia sebagai klaim pengguna.

Kebijakan paling menarik yang ditunjukkan di sini adalah dalam metode AddPolicy ketiga, karena menggunakan persyaratan otorisasi kustom. Dengan menggunakan persyaratan otorisasi khusus, Anda dapat memiliki banyak kontrol atas bagaimana otorisasi dilakukan. Agar ini berfungsi, Anda harus menerapkan jenis-jenis ini:

Jika pengguna memenuhi persyaratan, panggilan ke context.Succeed akan menunjukkan bahwa pengguna diotorisasi. Jika ada beberapa cara agar pengguna dapat memenuhi persyaratan otorisasi, beberapa penanganan dapat dibuat.

Selain mendaftarkan persyaratan kebijakan kustom dengan panggilan AddPolicy, Anda juga perlu mendaftarkan penangan persyaratan kustom melalui Injeksi Dependensi (services.AddTransient<IAuthorizationHandler, MinimumAgeHandler>()).

Contoh persyaratan otorisasi kustom dan penanganan untuk memeriksa usia pengguna (berdasarkan klaim DateOfBirth) tersedia dalam dokumentasi otorisasi Inti ASP.NET.

Otorisasi dan api minimal

ASP.NET mendukung API minimal sebagai alternatif untuk API berbasis pengontrol. Kebijakan otorisasi adalah cara yang disarankan untuk mengonfigurasi otorisasi untuk API minimal, seperti yang ditunjukkan contoh ini:

// 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");

Sumber daya tambahan