Setelah menggunakan berbagai teknik otentikasi dan otorisasi selama beberapa dekade, aplikasi MVC saya saat ini menggunakan metodologi berikut.
Klaim digunakan untuk semua otorisasi. Pengguna diberi satu peran (beberapa peran dimungkinkan tetapi saya tidak membutuhkan ini) - selengkapnya di bawah.
Seperti praktik umum, kelas atribut ClaimsAuthorize digunakan. Karena sebagian besar tindakan pengontrol adalah CRUD, saya memiliki rutinitas dalam pembuatan basis data kode pertama yang mengulang semua tindakan pengontrol dan membuat jenis klaim untuk setiap atribut tindakan pengontrol dari Baca / Edit / Buat / Hapus. Misalnya dari,
[ClaimsAuthorize("SomeController", "Edit")]
[HttpPost]
Untuk digunakan di dalam MVC View, kelas pengontrol dasar menyajikan item view bag
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
var user = filterContext.HttpContext.User as System.Security.Claims.ClaimsPrincipal;
if (user != null)
{
List<Claim> claims = user.Claims.Where(c => c.Type == this.GetType().Name).ToList();
ViewBag.ClaimRead = claims.Any(c => c.Value == "Read");
ViewBag.ClaimEdit = claims.Any(c => c.Value == "Edit");
ViewBag.ClaimCreate = claims.Any(c => c.Value == "Create");
ViewBag.ClaimDelete = claims.Any(c => c.Value == "Delete");
}
base.OnActionExecuting(filterContext);
}
Untuk menu situs web dan tindakan non-pengontrol lainnya, saya memiliki klaim lain. Misalnya apakah pengguna dapat melihat bidang moneter tertentu.
bool UserHasSpecificClaim(string claimType, string claimValue)
{
var user = this.HttpContext.User as System.Security.Claims.ClaimsPrincipal;
if (user != null)
{
return user.Claims.Any(c => c.Type == claimType && c.Value == claimValue);
}
return false;
}
public bool UserHasTradePricesReadClaim
{
get
{
return UserHasSpecificClaim("TradePrices", "Read");
}
}
Jadi, di mana peran Peran?
Saya memiliki tabel yang menautkan Peran ke sekumpulan klaim (default). Saat menyetel otorisasi pengguna, defaultnya adalah memberikan klaim kepada pengguna atas peran mereka. Setiap pengguna dapat memiliki lebih banyak atau lebih sedikit klaim daripada default. Untuk mempermudah pengeditan, daftar klaim ditampilkan oleh pengontrol dan tindakan (dalam satu baris), dengan klaim lain kemudian dicantumkan. Tombol digunakan dengan sedikit Javascript untuk memilih serangkaian tindakan guna meminimalkan "klik" yang diperlukan untuk memilih klaim. Di Simpan, klaim pengguna dihapus dan semua klaim yang dipilih ditambahkan. Aplikasi web memuat klaim hanya sekali, jadi setiap perubahan harus mendorong pemuatan ulang dalam data statis ini.
Oleh karena itu, manajer dapat memilih klaim mana yang ada di setiap peran dan klaim mana yang dimiliki pengguna setelah menetapkannya ke peran dan klaim default tersebut. Sistem ini hanya memiliki sejumlah kecil pengguna, jadi mengelola data ini sangatlah mudah