ASP.NET 2.0 Üyelik ve Rol Yönetimi - 2

ASP.NET 2.0 Üyelik ve Rol Yönetimi - 2 Oturum Açmış Kullanıcılarla Çalışmak

Oturum açmış kullanıcılarla çalışmak için hazır sunulan kontroller ile birlikte Kullanıcıların Parola Değiştirmesi, Oturum Durumlarını görmesi, Kullanıcı adlarının görüntülenmesi gibi işlemlere olanak tanıyan hazır kontroller bulunmaktadır.

LoginName Kontrolü

LoginName kontrolü adından da anlaşılacağı üzere oturum açan kullanıcının kullanıcının adını görüntülemek için kullanılmaktadır. Üyelik gerektiren sitelerde genellikle oturum açan kullanıcının kullanıcı ismi kendisine gösterilir bu işlem için ASP.NET Login kontrollerinde bulunan LoginName kontrolü site içerisinde kullanılmak istenilen yere sürüklenip bırakılarak kolaylıkla kullanılabilir. Kontrol sürüklenip bırakıldığında Label kontrolü ile benzerlik gösterdiği görülmektedir. Bu kontrol de diğer kontroller gibi kişiselleştirilerek görünüm ayarlarıyla oynanılabiliyor. Aşağıdaki kod bloğunda LoginName kontrollünün kullanımı görmektesiniz.

Hoşgeldiniz

Bu kodların bulunduğu sayfa çalıştırılıp oturum açıldığında aşağıdaki görüntü ile karşılaşılacaktır.

Kullanıcı adı LoginName kontrolü ile elde edilebileceği gibi kod tarafından User.Identity.Name kodları ile de elde edilip kullanılabilir. ChangePassword Kontrolü

ChangePassword kontrolü ile oturum açmış kullanıcılar kendi parolalarını değiştirebilmektedir. Kontrol varsayılan olarak yanda görüldüğü gibi gelmektedir ancak tabi ki tüm kontrollerde olduğu gibi bu kontrolde de tüm özellikler tanımlanmış durumdadır ve değiştirilebilmektedir. Bu kontrolde de gerekli olan doğrulama kontrolleri kullanılmış olup kullanıcının yanlış bir giriş yapması ya da TextBox"ları boş bırakması gibi hataların önüne geçilebilmiştir. Kontrol üzerinde yer alan tüm yazılar tamamen Türkçeleştirilebilmektedir bunlardan bir kaçına örnek vermek gerekirse; Üzerinde Change Password yazan tıklanıldığında eski parolayı yenisi ile değiştirecek olan  Button"un Text özelliğini değiştirmek için ChangePasswordButtonText özelliği kullanılabilmektedir veya en üstteki Başlık bilgisini değiştirmek için ChangePasswordTitleText özelliği kullanılabilmektedir. Diğer özelliklerde benzer şekilde kontrolün Properties penceresinden kolayca değiştirilebilmektedir.

Kontrolü çalıştırmak için herhangi bir sayfaya atıp sayfaya çalıştıralım. Password yazan bölüme kullanıcının aktif parolası girilmelidir. New Password yazan bölüme ve hemen altındaki TextBox"a da kullanıcının yeni parolası girilip Change Password Buttonuna tıklanılmalıdır. Bu işlemlerden sonra eğer herhangi bir hata oluşmadıysa Parolanın doğru bir şekilde değiştirildiği uyarı alınacak ve Continue Button"u görünüyor olacaktır. Continue Button"una tıklanıldığında sayfada hiç bir değişiklik olmamaktadır çünkü Continue Buttonu"na tıklanıldığında oluşan olayı ele almak gerekmektedir.

Continue Buttonu tıklanıldığında tetiklenecek olan olay ContinueButtonClick olayıdır ve bu olaya bir olay yakalayıcı yazılıp istenilen herhangi bir işlem yaptırılabilir. Aşağıdaki kodlar kullanıcıyı ChangePassword.aspx sayfasına yeniden yönlendirmektedir.

protected void ChangePassword1_ContinueButtonClick(object sender, EventArgs e)

{

Response.Redirect("ChangePassword.aspx");

}

ChangePassword kontrolünde eğer parola başarılı bir şekilde değiştirildiyse kullanıcılar istenilen bir sayfaya da yönlendirilebilmektedir. Bu işlem için kontrolün SuccessPageUrl özelliğinin ayarlanmış olması gerekmektedir.

Kod Yazarak Parola Değiştirmek

Kullanıcıların Parolaları ChangePassword kontrolü ile değiştirilebildiği gibi istenilse de MembershipUser sınıfından faydalanılabilir. Bu işlem için MembersipUser türünde bir değişken tanımlanmalı ve sistemde bulunan herhangi bir kullanıcı buna eşitlenmeli. Daha sona MembershipUser sınıfının ChangePassword merodu ile gerekli parola değiştirme işlemi yapılabilir. Bu konu aşağıdaki örnek ile daha kolay anlaşılabilecektir. Herhangi bir ASP.NET uygulamasına (Üyelik yönetimi için gerekli ayarlar yapılmış olmalı.) bir tane sayfa ekleyip bu sayfaya da iki tane TextBox ve bir tane Button sürükleyip bırakalım. Sayfanın görünümü aşağıdaki gibi olmalıdır. Düşündüğümüz senaryoda o andaki oturum açan kullanıcının parolası değiştirilecektir ancak istenilirse kullanıcı adı bilinen herhangi bir kullanıcının parolası da değiştirilebilir. Sayfada bulunan Button"a tıklanıldığı zaman çalışacak ve kullanıcının parolasını değiştirecek olan kodlar aşağıda görüntülenmektedir.

protected void Button1_Click(object sender, EventArgs e)

{

MembershipUser user = Membership.FindUsersByName(User.Identity.Name)[User.Identity.Name];

bool ParolaDegistirildiMi = user.ChangePassword(TextBoxOldPassword.Text, TextBoxNewPassword.Text);

if (ParolaDegistirildiMi)

{

Response.Write("Parola Değiştirildi...");

}

else

{

Response.Write("Parola Değiştirilemedi...");

}

}

Bu kodları satır satır açıklayalım. İlk olarak MembershipUser türünde bir değişken tanımlıyoruz. Tanımlamış olduğumuz değişkeni kullanabilmek için buna sistemde bulunan bir kullanıcıyı eşitlemek gerekiyor. Sistemde bulunan kullanıcıları da Membership sınıfının FindUserByName metodu ile buluyoruz. FindUserByName metodu içerisine bir tane string ister bu istediği string tahmin edeceğiniz gibi kullanıcı adıdır. Makalenin önceki bölümlerinden hatırlanacağı üzere User.Identity.Name bize o an oturum açmış olan kullanıcının adını veriyordu. Bu metot MembersihipUserCollection türünde bir koleksiyon döndürür bizim bunların içinden bir tanesini alıp kullanmamız gerekmektedir ve dolayısıyla [] operatörü ile kullanacak olduğumuz userı belirtip kullanıyoruz. MembersipUser sınıfının ChangePassword metodu gerekli parola değiştirme işlemini yapar ve eğer parola doğru bir şekilde değiştirildiyse true hata varsa false değerini döndürür. Bu metod"un ilk parametresi eski ikinci parametresi ise yeni paroladır. Kodlarda İf-Else bloklarıyla parolanın doğru bir şekilde değiştirilip değiştirilmediği kullanıcıya bildiriliyor.

LoginStatus Kontrolü

Kullanıcının Oturum durumuna göre faklı iki görüntüsü olan bu kontrol kullanıcının oturumu açıkken kapatmasını ve kullanıcı oturum açmamış durumda ise oturum açmasını sağlar. Kullanımı oldukça basit olan bu kontrol varsayılan olarak text tabanlıdır ama yazılım geliştiriciler isterlerde text yerine oturum kapalı iken oturum açılması için bir resim veya tam tersi durum için bir resim kullanarak kullanıcılara daha hoş görüntüler gösterebilirler. Eski zamanlarda yazılım geliştiriciler bu işlemleri bir takım tekniklerle panellerin görünürlüğü ile oynayarak yaparlardı ama artık bunların hiçbirine gerek kalmadı sadece bir LoginStatus kontrolü ile kullanıcının oturum durumuna göre Oturumu Kapat veya Oturum Aç linkleri kullanıcılara gösterilebilmektedir.

PasswordRecovery Kontrolü

Oturum açılması gereken bir sitede kullanıcılar genellikle parolalarını unutmaktadır ve hemen hemen her site bir şifre hatırlatma mekanizması kullanmaktadır. Bunlardan bazıları kullanıcının şifresini sıfırlayıp kullanıcıya o anda gösterirken güvenliğe daha fazla önem verenler kullanıcının parolasını sıfırlayıp kullanıcının sistemde kayıtlı olan email adresine yeni şifresini gönderiyor. ASP.NET 2.0"la gelen PasswordRecovery kontrolünün de yaptığı işlem aslında tam olarak bu. Kullanıcının şifresini sıfırlayıp yeni şifreyi kullanıcıya göndermek. PasswordRecovery kontrolünün mail atabilmesi için SMTP ayarlarının uygulama ayarlama dosyasında (web.config) yapılmış olması gerekmektedir. SMTP ayarları aşağıda kodda görüldüğü gibi yapılabilmektedir.

defaultCredentials="true" />

...........

Bu mail ayarlarını yaptıktan sonra sıra geldi bir tane PasswordRecovery kontrolü sürükleyip bırakıp kullanmaya.

Kontrol sürüklenip bırakıldıktan sonra tek yapılması gereken mail ayarlarının yapılmasıdır.Kontrolün tüm ayarları yapıldıktan sonra aşağıdaki gibi olmalıdır.

Subject="Yeni Parolanız">

 

Bu ayarlarda mail"in burak.batur@netron.com.tr adresinden gideceği ve konusunun Yeni Parolanız şeklinde olacağı belirtiliyor. Sayfa çalıştırılıp kontrol denendiğinde ilk olarak kullanıcı adını soracak. Geçerli bir kullanıcı adı belirtildikten sonra hatırlatma sorusu sorulacak ve geçerli cevap girildiğinde mail gönderilip bu durum kullanıcıya belirtilecek. Biraz bekledikten sonra gelen mail aşağıdaki gibi olmalıdır. Burada dikkat ederseniz konu belirtilen şekilde geldi ve parola oldukça karmaşık bir şekilde üretilerek sıfırlandı.

Membership API"leri İle Çalışmak

Şu ana kadarki bölümde genellikle hazır kontrolleri kullanmak üzerinde yoğunlaşıldı.Arada bir kaç yerde kod tarafından da bir şeyler yapılabileceği gösterildi ama şimdi bu bilgiyi biraz daha ileriye taşıyıp ekstra bir kaç şey üzerinde daha duruyor olalım.İlk olarak Membersip sınıfının bir kaç özelliğinden bahsedelim. Yukarıda bir kaç yerde aslında Membership sınıfını kullandık. Şimdi önceki bölümlerde bahsetmediğimiz bir kaç özellikten daha bahsediyor olalım.

Hatırlıyorsanız sisteme yeni kullanıcı eklerken kullanıcının parolası konusunda bir kaç ayar yapmıştık örneğin minimum karakter sayısını 5 yapıp minimum alfa-nümerik olmayan karakter sayısının da 0 olarak ayarlamıştık. Bu ayarlar kod tarafından değiştirilemiyor ama Membership sınıfı altında bulunan özellikler yardımıyla değerleri okunup istenilen yerde kullanılabiliyor. Nerede kullanabilirim? şeklinde bir soru kafanızda canlanmış olmalıdır. Sisteme yeni bir kullanıcı eklenirken bunu CreateUserWizard kontrolü yerine TextBox"lar ve Button"lar yardımıyla kendiniz yapıyorsanız bahsedilen değerleri kullanıcıya gösteriyor olmak daha güzel bir tasarım açısından mantıklı olacaktır.

Membership sınıfı ile sistemde bulunan kullanıcılar da sorgulanabilmektedir. Örneğin FindUsersByEmail metodu ile belirtilen email adresine sahip olan kullanıcılar getirilecektir, FindUsersByName metodu ile de belirtilen kullanıcı adına sahip kullanıcılar getirilecektir (Hatırlarsanız bu metodu yukarıdaki örneklerde kullanmıştık.) . Bu iki metot MembershipUserCollection türünde bir koleksiyon döndürür. Her kullanıcı tek tek değerlendirilmek istenirse MembershipUser türüne teker teker atılarak değerlendirilebilir. Sistemde bulunan kullanıcıları almak için Get ile başlayan metotlarda mevcuttur GetUser metodu bunlardan biridir toplam 6 tane overload"ı olan bu metod MembersipUser türünde tek bir kullanıcı döndürür. Gene Get ile başlayan diğer bir metot da GetUserByEmail metodudur.Bu metot belirtilen email adresine sahip olan kullanıcıyı döndürür. GetAllUsers metodu sistemde kayıtlı olan tüm kullanıcıları döndürür.

Membership sınıfının diğer metotları da kullanıcı oluşturmak, güncellemek ve silmek ile ilgili olan metotlarıdır. Bunlar isimlerinden kolayca anlaşılmaktadır. Kullanıcı oluşturmaya yarayan metot olan CreateUser"ı makalenin önceki bölümlerinde ele almıştık. Sistemde bulunan bir kullanıcının ayarlarını güncellemek için UpdateUser metodu kullanılacaktır. Bu metot içine MembershipUser türünde bir parametre alır ve burada belirtilen özelliklere göre kullanıcıyı günceller. Kullanıcı silmek için kullanılacak olan metot ise DeleteUser metodudur. İki tane OverLoad"ı olan bu metot ya sadece kullanıcıyı siler ya da kullanıcının bulunduğu tüm tablolardan kullanıcıyı siler. Kullanıcı oluşturmakta faydalı olan bir diğer metodu da burada açıklamak mantıklı olacaktır; GeneratePassword. GeneratePassword metodu belirtilen değerlere göre rasgele parola üretir ve bu parolayı string olarak döndürür. Kullanıcı oluşturulurken elle parola girilmek istenmiyorsa bu metot kullanılabilir.

Membership sınıfının bir metodu da sitede o an kaç kullanıcının Online olduğu bilgisini döndürmektedir. Bu metodun adı da tahmin edeceğiniz gibi GetNumberOfUsersOnline"dır. Bu metot int türünde bir değer döndürmektedir.

Membership sınıfını açıklarken sıklıkla bahsettiğimiz bir sınıf daha söz konusudur. Bu da MembershipUser sınıfıdır. MembershipUser sınıfı kullanıcıya özgü bilgileri içermektedir. Bu sınıfın da bir kaç özellik ve metodundan bahsetmek istiyorum. IsOnline özelliği üzerinde çalışılan kullanıcının o an Online olup olmadığını döndürür. ChangePassword metodunu makalenin önceki bölümlerinden hatırlıyor olmalısınız. Kullanıcının parolasını değiştirirken kullanılıyordu. Login kontrolleri incelendiğinde kullanıcıların hatırlatma sorularını ve cevaplarını değiştirecek bir kontrol olmadığı görülmektedir. Bu işlem için ChangePasswordQuestionAndAnswer metodu kullanılabilir. Bu metot içerisine üç tane parametre kabul eder. Bunlardan biri güvenlik gereği kullanıcının şifresi, diğer ikisi güvenlik sorusu ve cevabı. Bu kadar teorik bilgiden sonra burada açıkladığımız bilgiler ışığında bir kaç işlem yapıyor olalım.

Kullanıcının Güvenlik Sorusunu ve Cevabını Güncellemek

Bu işlem için gene kullanıcının oturum açtığı bir senaryoyu düşünelim. Kullanıcı oturum açtığında güvenlik sorusu değiştirme sayfasına gelecek ve gerekli bilgileri belirterek işlemi gerçekleştirecek. Bu işlemler için yeni bir sayfa oluşturup sayfaya üç tane TextBox bir tane LinkButton ve bir tane de ValidationSummary kontrolü sürükleyip bırakalım. Doğrulama kontrollerini de kullanarak güzel bir sayfa tasarımı yapıyor olalım. Bu işlemler sonucunda sayfanın tasarımı aşağıdaki gibi olacaktır.

Sayfanın MasterPage"den türeyen bir sayfa olduğuna dikkat edin. Sayfayı oluşturacak olan HTML kodları da aşağıdaki gibidir.

Güvenlik Sorusu ve Cevabı Güncelleme Alanı

Güvenlik gereği bu alanda eski güvenlik sorunuz ve cevabınız size gösterilemez.

Bu alandan iki bilgiyi de değiştirebilirsiniz.

Parolanız:

Display="Dynamic" ErrorMessage="Parola alanı boş bırakılamaz.">*

Güvenlik Sorunuz:

Display="Dynamic" ErrorMessage="Soru alanı boş bırakılamaz.">*

Güvenlik Sorunuzun Cevabı:

Display="Dynamic" ErrorMessage="Cevap alanı boş bırakılamaz.">*

Kaydet

Button"un Click olayına yazılacak olan kodlar aşağıdaki gibi olmalıdır.

protected void LinkButton1_Click(object sender, EventArgs e)

{

MembershipUserCollection user=Membership.FindUsersByName(User.Identity.Name);

if (user[User.Identity.Name].ChangePasswordQuestionAndAnswer(TbParola.Text, TbSoru.Text, TbCevap.Text))

{

TbParola.Text = String.Empty;

TbSoru.Text = String.Empty;

TbCevap.Text = String.Empty;

Response.Write("Güvenlik sorunuz ve cevabınız değiştirildi.");

}

else

{

Response.Write("Bir hata oluştu kayıt güncellenemedi...");

}

}

Kodlar incelenecek olursa FindUserByName metodu ile Online olan kullanıcı sistemden bulunuyor ve bu MembershipUserCollection türündeki bir değişkene aktarılıyor. Daha sonra [] operatörü ile istenilen kullanıcı bulunup ChangePasswordQuestionAndAnswer metodu ile kullanıcının bilgileri güncelleniyor. Bilgiler güncellendi ise True hata oluştu ise False değeri döndürülecektir. Bu bilgiden faydalanılarak kullanıcıya durum bildiriliyor.

Sitedeki Online Kullanıcıları Göstermek

Pek site o an sitede bulunan kullanıcıları görüntüleyerek kullanıcılar arasındaki etkileşimi arttırmak ister, www.yazgelistir.com sitesi de bu sitelerden biridir ve Online kullanıcıların kullanıcı adları son kullanıcıya gösterilir. Membership Api"si kullanılarak bu işlemi yapmak oldukça basittir. Yukarıda anlattığımız bilgiler ışığında bu işlem kolayca yapılabilmektedir. Bu işlemi de hemen örnekliyelim. Ana sayfaya bir tane Label sürükleyip bırakalım ve ID"sini de LabelOnlineUye olarak ayarlayalım. Bu işlemden sonra sayfanın Page_Load olayında bir şeyler yapmamız gerekiyor çünkü sayfa ilk yüklenirken Online üyeler belirlenmesi ve Label"a yazılması istenilmektedir. Sayfanın PageLoad metoduna yazılacak olan kodlar aşağıdaki gibidir.

if (!Page.IsPostBack)

{

     foreach (MembershipUser user in Membership.GetAllUsers())

     {

          if (user.IsOnline)

          {

               LabelOnlineUye.Text += user.UserName + ", ";

          }

     }

}

Gördüğünüz gibi toplam 10 satır kodla bu iş yapılabildi. İlk olarak tüm kullanıcılar sistemden çekilmeye başladı ve bunlardan Online olanların kullanıcı adları Label"a eklendi.

Üyelik ve Rol Bilgilerini İstenilen Bir Veritabanında Depolamak

Membership bilgileri varsayılan olarak SqlExpress"de sitede yeni oluşturulan bir veritabanında depolanmaktaydı çünkü Membership sağlayıcısındaki ayarlar LocalSqlServer"ı işaret ediyordu ve bu da Machine.config"de tanımlı olan SqlExpress"i işaret eden bağlantı cümlesiydi. Küçük uygulamalar için SqlExpress yeterli olacaktır ama daha büyük veya daha önceden çalışan ve yeni sisteme geçirilmeye çalışılan bir site için SqlExpress uygun bir çözüm değildir. Bu gibi durumlarda veriler mutlaka başka bir veritabanında depolanmalıdır. Bu işlem için ilk olarak verilerin depolanacak olduğu veritabanı üyelik ve rol bilgilerini depolayacak şekilde ayarlanmalıdır. Bu ayarlamayı yapmak için Aspnet_RegSql.exe uygulamasından faydalancağız.Aspnet_Regsql.exe uygulaması C:WINDOWSMicrosoft.NETFrameworkv2.XXXX yolu altında bulunmaktadır.Uygulamayı çalıştırmak için Dos ekranında bu yola gidilir ve Aspnet_RegSql.exe yazılıp Enter"a basılır. Bu işlemden sonra karşımıza bir tane sihirbaz çıkacaktır.Next dedikten sonra iki seçenek bizi karşılıyor olacak bunlardan üstteki bir veritabanına üyelik yönetimi desteği verilmek istendiğini diğeri ise veritabanından bu desteği kaldırılmak istendiğini belirtir.

Configure SQL Server for application services seçeneğinin seçili olduğundan emin olunup Next tuşu ile devam edilir. Karşımıza yeni çıkan pencere uygulama servisleri için destek verilecek olan veritabanının seçilecek olduğu bölümdür. Bu alandan istenilen veritabanı seçilir ve Next tuşuna basılır.

Bu alandan sonra seçili olan veritabanı bilgileri gösterilip son bir onay için tekrar Next tuşuna basılır. Eğer herhangi bir problem yoksa belirtilen veritabanında gerekli tablo, stored procedure vb. gibi nesneler oluşturulur. Eğer herhangi bir hata oluşmadıysa veritabanın başarıyla oluşturulduğunu belirten aşağıdaki ekran görüntüsü ile karşılaşılır.

Bu ekran görüntüsünde bir şey daha söylenmektedir. Veritabanın başarıyla oluşturulduğu ve Membership ayarlarının yapılması gerektiği belirtilmektedir. Ancak biz şöyle bir yola gideceğiz. Hatırlıyorsanız Membership sağlayıcısı LocalSqlServer adındaki bağlantı cümlesini kullanıyordu. Biz uygulamamızda bu bağlantı cümlesi için machine.config"den gelen ayarları iptal edip bunu aşağıda görüldüğü gibi yeniden oluşturursak başka bir ayar değiştirmeden amacımıza ulaşmış oluruz.

..............

Döküman Arama

Başlık :

Kapat