Yetki ve izin mekanizmasını genel olarak Roller vasıtasıyla gerçekleştirilmektedir. Örneğin Admin roünde bir kişi tüm kullanıcıları görüp bu kullanıcılar üzerinde işlem yapabilirken. Normal kullanıcı rolune sahip birisi sadece kendine ait bilgileri görebilir.
Dikkat ettiyseniz [Authorize] bölümünde Rol belirtilmiş. Bu kullanıcının hem giriş yaptığını hem de Administrator rolüne sahip olduğunu garanti eder. Aksi halde kullanıcı bu kontrolöre giriş yapamaz.
Şimdi bir Görüntü Modeli oluşturun
Models/ManageUsersViewModel.cs
Son olarak Görüntüyü oluşturun Views/ManageUsers/Index.cshtml
Uygulamayı başlatın, normal kullanıcı olarak giriş yapın ve /ManageUsers sayfasına gidin. Aşağıdaki gibi bir Giriş Engellendi sayfasını göreceksiniz.
Bu sayfayı görmenizin nedeni web uygulamanıza Administrator olarak giriş yapmadığınızdan dolayıdır.
Test Admin Hesabı Oluşturma
Kullanıcılara kayıt olurken bir onay kutusu ile admin olmak istiyormusunuz demek çokta mantıklı değidir. Bunun yerine Startup sınıfına yazacağımız kod ile test admin hesabı oluşturmak mümkündür. Startup sistem ayağa kalkarken çalışacak ve böylece bir admin hesabı uygulama başladığında kullanımınıza hazır hale gelecektir.
Aşağıdaki değişikliği Configure metodu içinde yer alan if(env.IsDevelopment()) kontrolünün içerisine yazın.
Startup.cs
EnsureRoleAsync ve EnsureTestAdminAsync metodları RoleManager ve UserManager servislerine ihtiyaç duyar. Bundan dolayı bu servisleri Startup sınıfına enjekte etmemiz gerekmekte. Bunun için aşağıdaki değişikliği yapın
Aşağıdaki iki metodu Configure metodunun altına yapıştırın Önce EnsureRolesAsync metodu
Bu metod veri tabanında Administrator rolünün olup olmadığını kontrol eder. Eğer yoksa oluşturur. Her yerde Administrator'ü elle yazmaktansa Constants adında yeni bir sınıf oluşturup onun içerisine sabit değerlerimizi yazabiliriz.
Constants.cs
Daha önce oluşturduğumuz ManageUsersController kontrolörünü de bu sabit ile değiştirebilirsiniz.
EnsureTestAdminAsync metodunu yazın
Startup.cs
Eğer admin@todo.local isminde bir kullanıcı yoksa, bu metod yeni bir kullanıcı oluşturacak ve geçici şifre atayacak. Giriş yaptıktan sonra şifreyi daha güvenli bir şifre ile değiştirmeniz gerekmekte.
Bu iki metodda asenkron ve Task döndürdüklerinden bunlar Configure içerisinde wait ile kullanılmalılar. Aksi halde Configure metodu çalışmaya devam eder ve bu değişiklikleri atlar. Bunun için normalde await kullanmamız gerekmekte. Fakat teknik nedenlerden dolayı Configure içerisinde await kelimesini kullanamıyoruz. Bundan dolayı başka bir yerde await kullanmamız gerekmekte.
Uygulamayı çalıştırdığınızda admin@todo.local hesabı oluşturulacak ve Administrator rolü atanacak. Bu kullanıcı ile giriş yapaıp http://localhost:5000/ManageUsers sayfasına gidin.Uygulamaya kayıt olmuş tüm kullanıcıların olduğu listeyi göreceksiniz.
Bunun yanında kendiniz yeni bir özellik ekleyebilirsiniz. Örneğin bir buton ile sadece Admin'in kullanıcıları silebileceği değişikliği yapabilirsiniz.
Görüntü sayfasında kullanıcı kontrolü
[Authorize] özelliği ile kontrolör veya aksiyonda kullanıcı kontrolü yapmak mümkün, fakat ya Görüntü dosyasına buna ihtiyacımız olursa? Örneğin "Kullanıcı Yönetimi" bağlantısı menüde olsa çok işimize yarar. Fakat bu linkin sadece Admin kullanıcısına görünmesi gerekmekte.
UserManager'i doğrudan Görüntü dosyasına enjekte etmek mümkün, bunun vasıtasıyla istediğiniz kontrolleri yapabiliriz. Görüntü dosyamızı daha temiz tutmak için yeni bir kısmi görüntü dosyası ( partial view ) oluşturun. Bu kısmi görüntü içerisinde kontrollerimizi yapacağız ve eğer giren kullancıcı Administrator rolüne sahipse "Kullanıcı Yönetimi" bağlantısını görebilir.
Views/Shared/_AdminActionsPartial.cshtml
Kısmi Görüntü küçük bir görüntü parçasıdır, genelde diğer Görüntü dosyalarına gömülürler. Bundan dolayı belirleyici olarak başlangıçlarına _ işareti koyularak kısmi olduğu belirtilir. Tabi bu zorunlu değildir.
Bu kısmi görüntü önce SignInManager ile kullanıcının giriş yapıp yapmadığını kontrol eder. Eğer giriş yapmamışlarsa, kodun geri kalanının önemi yoktur. Eğer giriş yapmış kullanıcı varsa, UserManager ile IsInRoleAsync metodu çağırılarak bu kullanıcının diğer özelliklerine bakılır. Eğer bu kontrol başarılı ise navigasyona "Kullanıcı Yönetimi" eklenir.
Tabi bu kısmi görüntünün ana görüntüye gömülmesi gerekmekte. Bunun için _Layout.cshtml içerisine gidin ve aşağıdaki değişikliği yapın.
Views/Shared/_Layout.cshtml
Admin kullanıcısı ile girdiğinizde sağ üst tarafta aşağıdaki gibi "Kullanıcı Yönetimi" (Manage Users) bağlantısını göreceksiniz.
Manage Users link
Özet
ASP.NET Core Kimlik oldukça güçlü bir güvenlik ve kimlik sistemidir. Bu sistem ile kimlik doğrulaması ve izin kontrolleri yapabilir. Buna harici kimlik servis sağlayıcılar(facebook, google, twitter) ekleyebilirsiniz. dotnet new şablonu size kullanıcı girişi ve kayıdı gibi genel senaryoları içeren projeyi oluşturur.
ASP.NET Core Kimlik ile ilgili daha detaylı bilgiyi https://docs.asp.net adresinde bulabilirsiniz.
using System.Collections.Generic;
using AspNetCoreTodo.Models;
namespace AspNetCoreTodo
{
public class ManageUsersViewModel
{
public IEnumerable<ApplicationUser> Administrators { get; set; }
public IEnumerable<ApplicationUser> Everyone { get; set; }
}
}
if (env.IsDevelopment())
{
// (... some code)
// Make sure there's a test admin account
EnsureRolesAsync(roleManager).Wait();
EnsureTestAdminAsync(userManager).Wait();
}