Öncelikle, AuthorizeAttribute nesnesi role ve kullanıcıya göre nasıl yetkilendirilir bunu görelim. Örneğin;
[Authorize(Roles="Administrator")] public class AdminController : Controller
şeklinde bir kullanımda, AdminController sınıfına sadece belirlenen rollerdeki kullanıcılar girebilir. Ayrıca kullanıcıya özel yetkilendirme de yapılabilir. Örneğin;
[Authorize(Users="ali,veli,ahmet,mehmet")] public class KullaniciOzelController:Controller
şeklinde bir kullanımda, sadece belirlenen kullanıcılara özel bir yetkilendirme yapılır.
Bu tanımlamalar, hazır olan membershipProviderlar ile çalışacaktır. Ama bizim kendi kullanıcı ve rol tablolarımızı, bu nitelik ile nasıl kullanacağız. Yani Authorize niteliği için Roles ve Users parametrelerini nasıl kullanacağız.
Bunun için override etmemiz gereken metodlar olacaktır. Örneğin haber istesi projesinde Kullanıcı ve Rol tablolarımız var. Bunları üyelik sisteminde nasıl kullanacağız.
- Kendi üyelik sağlayıcı sınıfımızı yazacağız.
- Kendi rol sağlayıcı sınıfımızı yazacağız.
- Bu sağlayıcıları, web.config dosyamızda tanımlayacağız.
Authorize, nitaliğinin Roles ve Users parametrelerini kullanmak için aşağıdaki metodları override etmemiz gerekiyor.
public class UyelikSaglayici : MembershipProvider { public override bool ValidateUser(string kullaniciAdi, string sifre) { } } public class RolSaglayici : RoleProvider { public override bool IsUserInRole(string kullaniciAdi, string rolAdi) { } public override string[] GetRolesForUser(string kullaniciAdi) { } }
Proje içerisinde ~/Uygulama/Uyelik klasörü içerisinde bu sınıflarımız mevcut. Bu sınıfları yazdıktan sonra, web.config içerisinde bu sağlayıcıları kullanacağımızı belirtmemiz gerekir. Bu arada, diğer metodları da isterseniz override edebilirsiniz. AuthorizeAttribute için yukarıdakiler yeterli olacaktır.
web.config içerisindeki ayarlar:
<membership defaultProvider="UyelikSaglayici"> <providers> <!--<add name="DefaultMembershipProvider" type="System.Web.Providers.DefaultMembershipProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" applicationName="/" />--> <add name="UyelikSaglayici" type="HaberSitesi.Web.Uygulama.Uyelik.UyelikSaglayici" connectionStringName="DefaultConnection" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" applicationName="/" /> </providers> </membership> <roleManager defaultProvider="RolSaglayici" enabled="true"> <providers> <add name="RolSaglayici" type="HaberSitesi.Web.Uygulama.Uyelik.RolSaglayici" connectionStringName="DefaultConnection" applicationName="/" /> </providers> </roleManager>
Böylece kendi üyelik sistemimizle bu nitelikleri tam manasıyla kullanabiliriz. Biraz karışık bir anlatım olmuş olabilir. Ama projeyi açık inceleme şansınız olursa sanırım daha iyi anlaşılacaktır. Anlaşılmayan kısımlar hakkında geri dönüş yapılırsa, elimden geldiği kadar anlatmaya çalışırım.
Merhaba,
YanıtlaSilHaber Portalınıo yazarken, hangi mimariyi ve tasarım desenlerini kullandınız?
Tasarım deseni yok. Servis ve Data katmanları var. Data katmanında Repository yok. Eğitim amaçlı olduğundan ORM yi repository gibi kullandım. Şu an bir makale yazıyorum. Dependency Injection, IoC, Repository, Unit of Work desenlerinin kullanıldığı ve yine, servis ve veri katmanının oldugu bir yazı olacak. Tek makalede, full bir proje nasıl oluşturulur bundan bahsetmeye calısacagım. ama merak ettiğiniz bişey varsa sorabilirsiniz
SilBirde vs 2010 da çalışması için nasıl bir yol izlemeliyiz?
YanıtlaSilOnu tam olarak bilmiyorum hic araştırmadım. Müsait oldugumda bir araştırayım. Sizde bir yol bulursanız paylasırsınız.
SilMerhaba,
YanıtlaSilBenim sorum biraz daha genel olucak; Sizin yaptığınız gibi kendim Role UserRoles tablolarını oluşturdum ve roleprovider olarak default role provider kullanmak istesem nasıl bi yol izlemeyelim ? Yani kendim yazmak istemiyorum sağlayıcıyı ama bu sefer User.IsInRole değeri yetkili olmasına rağmen false döndürüyor..
Yazılarınız ve verdiğiniz emek için çok teşekkür ederim. Dependency Injection, IoC, Repository, Unit of Work desenleri, servis yönelimli mimari ve çok katmanlı mimariyi temel mantığından, neden ihtiyaç duyulduğuna, inebildiğiniz kadar derinliğine bir makale dizisi yazarsanız çok faydalı olacağına inanıyorum. Umarım yazacak zamanı bulabilirsiniz. Tekrar emeğinize sağlık, kolay gelsin...
YanıtlaSilMerhaba,
YanıtlaSil/Admin/Etiket/Etiketler şeklinde bir istek oluşturduğumda giriş yapmayan kullanıcılar için proje Uyelik Controller a yonlendirme yapıyor bunu nasıl sağladığınız?
Bu yorum yazar tarafından silindi.
Silhttps://github.com/alirizaadiyahsi/HaberSitesiV2/blob/master/HaberSitesi.Web/Web.config
Silburada system.web altında, authentication diye bir ayar var. Buraya yönlenmesini istediginiz adresi yazıyorsunuz.
Çok tşkler.
SilAli bey bir sorum daha var. AnaController içersindeki OnActionExecuting metodu hep sürekli çalışıyor bir istekte. Mesela örneğin /Admin/Etiket/Etiketler istediğinde olduğu gibi. Ve bu çalışan metod içersnde ise sürekli servis e git gel yapılıyor. Bu metodu sadece 1 kez çalıştırma gibi bir arayış içersine girdiğiniz mi sorunu algılayıp. Eğer çözüm üretebildiyseniz paylaşabilirmisiniz?
SilO metod her zaman çalışır. ActionMetod zaten her istekte çalışmalı, amacı bu. Ama servise gitmesi mantıklı değil. Bunun için kullanıcının diğer verilerinide tutacak şekilde bir IPrincible yazmak gerekiyor. Yani bunu genişletmek gerekiyor. Additional User Data şeklinde aratırsanız, bu sorunu çözersiniz.
SilEvet bende zaten servise gitmesi konusunda demiştim. Tşkler bilgiler için.
Sil