12 Temmuz 2013 Cuma

MSSQL Membership

MSSQL Membership

Standart Bir Mssql Membership Nasil Olusturulur

Öncelikle: New > Project > Asp.net Web Application Diyerek standart bir asp.net uygulaması oluşturalım. Bu proje şimdilik dursun gelelim mssql tarafına. Microsoft SQL Server Management Studio Express’i açalım.
SQL Server Management Studio Express Giriş Ekranı
Connect diyerek localdeki Sql Servera bağlanalım. Bağlandıktan sonra Databases > New Database yolunu takip edelim.
SQL Server Management Studio Express ile Veritabanı oluşturma
İsmini Mssql_Membership olarak verdim. Şimdide membership için gerekli tabloları oluşturalım.
1. C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727 yoluna gidip aspnet_regsql.exe uygulamasını çalıştırın. Çıkan ekrandan ilk pencereyi next diyerek geçin. Sonraki ekranda Configure Sql Server for application services ı seçip ileri deyin. Şimdi karşınıza aşağıdaki ekran çıkacak.
aspnet_regsql kullanarak membership tablolarını otomatik oluşturma-1 (C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regsql.exe
Burdaki olay şu. Bu membership tabloları hangi veritabanında oluşturulacak. Bir makinada birden fazla instance olabileceğinden Mousty\SqlExpress kısmı da değişebilir. Ama Database kısmında biraz önce yarattığımız veritabını görüyorsak tamamdır. Next diyelim. Burda yapılacak değişikliklerle ilgili bilgiler veriyor. Next deyip The database has been created or modified yazısını görmüşseniz veritabanında ilgili tablolar oluşturulmuştur anlamına gelir. Finish deyip buradaki olayımızı bitirelim. Veritabanımıza geri döndüğümüzde şöyle bir şey çıkıyor karşımıza…
aspnet_regsql ile oluşturulan tabloların görünümü (C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regsql.exe)
Veritabanıyla işimiz bu kadardı. Şimdi Visual Studioya dönelim.
Web.config dosyamızı açalım ve değişikliklerimizi yapalım.
<connectionStrings/>
Kısmını
<connectionStrings>
<add name="Mssql_MembershipConnectionString" connectionString="Data Source=MOUSTY\SQLEXPRESS;Initial Catalog=Mssql_Membership;Integrated Security=True" providerName="System.Data.SqlClient" />
</connectionStrings>
Şeklinde değiştirelim. Tabiki burda Data Source=MOUSTY\SQLEXPRESS ve Catalog=Mssql_Membership alanlarını kendinize göre değiştireceksiniz. Eğer connection ayarlarını nasıl yapacağınızı bilmiyorsanız http://www.connectionstrings.com dan bakabilirsiniz. Şimdide:
<authentication mode="Windows" />
Kısmını
<authentication mode="Forms">
        <forms loginUrl="~/login.aspx" defaultUrl="~/panel/default.aspx"/>      
</authentication>
Şeklinde değiştirin. loginUrl eğer kullanıcı kısıtlı bölgelere erişmek ister ve giriş yapmamış ise login.aspx sayfasına yönlendirilecek. Ve login olduktan sonrada ~/panel/default.aspx sayfasına yönlendirilecek. Şimdide membership düğümünü ayarlayacağız.
<membership defaultProvider="BizimProvider">
        <providers>
          <clear/>
          <add name="BizimProvider" 
               type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
               connectionStringName="Mssql_MembershipConnectionString" 
               enablePasswordRetrieval="false" 
               enablePasswordReset="true" 
               requiresQuestionAndAnswer="false" 
               requiresUniqueEmail="true" 
               passwordFormat="Hashed" 
               maxInvalidPasswordAttempts="5" 
               minRequiredPasswordLength="6" 
               minRequiredNonalphanumericCharacters="0" 
               passwordAttemptWindow="10" 
               passwordStrengthRegularExpression="" 
               applicationName="/"/>
        </providers>
      </membership>
Providers kısmını öncelikle clear dedik. Çünkü başka bir ön tanımlı membership kullanmaya kalkmasın sistemimiz. Şimdi burdaki değerler ne anlam ifade ediyor kısaca onlara bakalım.
Name: Bizim kendimizin tanımladığı aynı zamanda membership düğümünde hangi providerı kullanacağına işaret eden isim. Membership düğümünün altında 1den fazla provider tanımlı olabilirdi. O yüzden hangisini kullanacağını isimden ayırt ediyor.
Type: Providerımızın kullanacağı membership yapısının tanımlı olduğu isim uzayı + sınıf (namespace + class). Kendi membership sistemimizi yazmış olsaydık o zaman kendi sınıfımızın isim uzayını ve ismini yazacaktık buraya. Burdaki standart membership olduğundan uzunca bir tanımlaması var.
connectionStringName: Bu provider hangi veritabanını kullanacağı burda belirtiliyor. ConnectionStrings düğümünde belirttiğimiz bağlantı isimlerinden birini yazın.
enablePasswordRetrieval: Kullanıcıya şifresini gerialma yetkisi vermek istermisiniz o zaman ayarı budur.
enablePasswordReset: Kullanıcı şifresini unuttuğunda şifresini sıfırlayabilsin mi?
requiresQuestionAndAnswer: Kullanıcı kayıt olurken Güvenlik Sorusu ve Cevabı aktif olsun mu
requiresUniqueEmail: Her kullanıcı sadece tek email adresi ile mi ilişkilendirilsin. Eğer false ise birden fazla kullanıcı aynı email adresi ile sisteme kayıt olabilir.
passwordFormat: Kullanıcı şifrelerinin veritabanında nasıl saklanılacağı. Opsiyonları:
•Clear: Şifreler direk veritabanına olduğu gibi kayıt edilir.
•Encrypted: Şifreler şifrelenerek veritabanına kaydedilir ve daha sonra kullanıcıya okunur bir şekilde gösterilebilir. (Çift Yönlü Dönüşüm Yapılabilir.)
•Hashed: Şifreler şifrelenir. Fakat kullanıcıya da daha sonradan gösterilemez. (Tek Yönlü Dönüşüm Yapılır)
Ben genelde encrypted kullanırım. Olur ya ileride göstermek isterim şifresini diye… Ama passwordFormat kısmını Encrypted olarak ayarlar iseniz ekstra bir şey daha yapmamız gerek. Oda web.config dosyamız içine <system.web>..</system.web> içinde herhangi bi yere şunu eklemeniz gerekir.
<machineKey validationKey="EECA48CD7D7DEF9E652E7F9451AE8D76D67EB3E7E43766D12318CBA64C58A761D6E68AA58E7EB149ECAB9FF915BF07615FA682F501285FC361DA8B72C527FF6C"
decryptionKey="4F8E8E4F236A3B24DE50D6BBB393E9911A1F2428AF23C82B" validation="3DES"/>
Ya buda nedir dediğinizi duyar gibiyim. Şimdi Encrypted türü şifrelemede kullanıcı şifresinin geri döndürülebilmesi için bir tane sabit keyimiz olmalı ki kullanıcı oluşturulurken veritabanına kaydedilecek şifre bu key baz alınarak oluşturulsun. Ve aynı şekilde geri döndürülebilsin. Bu machineKey düğümünü nasıl oluştururum kendim diye sorarsanız nette arayın machineKey creator diye çıkar karşınıza. Aradığımda çıkan 2. Sonuç benim istediğimi yapıyor. Adres: http://aspnetresources.com/tools/keycreator.aspx
Eğer şifreleme metodunuz Encrypted ise ve machineKey tanımlamamışsanız şöyle bir hata alırsınız.
You must specify a non-autogenerated machine key to store passwords in the encrypted format. Either specify a different passwordFormat, or change the machineKey configuration to use a non-autogenerated decryption key.
maxInvalidPasswordAttempts: maksimum yanlış şifre girilme sayısı. Eğer kullanıcı burdaki değerden fazla sayıda yanlış şifre girmişse hesabı kitlenir ve bundan sonra şifresini doğru girsede siz kilidi kaldırıncaya kadar da sisteme giriş yapamaz.

minRequiredPasswordLength: Gerekli minimum şifre uzunluğu. (Kayıt olurkenki)
minRequiredNonalphanumericCharacters: Gerekli minimum alfa-numeric karakter sayısı.
passwordStrengthRegularExpression: Burda kullanıcının girmesi gereken şifre tarzını regular expression ile belirtebilirsiniz. Mesela şifre şu kadar uzunlukta ve bir harf bir rakam şeklinde girsin gibi. (Hiç kullanmadım burasını)
applicationName: Bu membership uygulamamızın adı. Ee daha önce tanımladık bu ne şimdi derseniz eğer şöyle söyleyeyim. Bir mssql veritabanı aldınız diyelim. Ve 3 tane 5 tane membership li sitenizi tek veritabanında fakat farklı kullanıcı ve rolleri olacak şekilde kullanmak istiyorsanız ayar burasıdır. Her uygulamaya farklı isim verirseniz istediğiniz olacaktır.
Şimdide RoleProvider ayarlarını yapalım web.config dosyasından
<roleManager enabled="true" defaultProvider="BenimRoleProviderim">
        <providers>
          <clear/>
          <add name="BenimRoleProviderim" type="System.Web.Security.SqlRoleProvider" connectionStringName="Mssql_MembershipConnectionString" applicationName="/"/>
        </providers>
</roleManager>
RoleProvider ne işe yarar der iseniz. Diyelimki kullanıcıları rollere atamak istiyorsunuz Mesela: adminusereditor vs. Bunların herbiri farklı klasörlere giriş yapması gerekir ise rollere göre ayrım yaptırabilirsiniz. Diyelim ki ~/Panel/ klasörüne sadece admin ler girebilir. Fakat ~/Editor klasörüne hem editor olarak tanımladığınız kişiler hemde admin ler giriş yapabilsin diye isteyebilirsiniz. Düğümde açıklanacak pek bişey yok membership düğümündekiler le aynı mantıkta.
Mssql Membership için oluşturduğumuz Projenin dosya yapısı
Şimdi solution explorer da görüldüğü üzere panel diye bir klasörümüz var içinde de default.aspx ve web.config dosyası var.Bu web.config dosyasında bu kısma kimlerin ulaşıp ulaşamayacağına karar vericez. Direk root taki web.config dosyasına da yazılabilirdi. Ama burda tercih ettim ben. Ve ayrıca ana dizinde login.aspx dosyasını oluşturdum. Şimdilik içleri boş bişey yapılmadı daha. İlk önce kendimize 2 tane rol 2 tane kullanıcı oluşturalım. ASP.NET Configuration’a tıklayıp açalım hazır kullanıcı oluşturma panelini (Şekilde de işaretli olan kısım).
Asp.net Website Administration Tool Ekran Görüntüsü
Karşımıza bu ekranın çıkması lazım. Burda Existing users: 0 yazısını görüyorsanız bir problem yoktur sisteminizde. Security linkine tıklayalım.
Asp.net Web Administration Tool Yardımı ile oluşturulmuş kullanıcı ve rol ekranı
Öncelikle Create or Manage Roles diyerek kendimize Admin ve User adında 2 tane rol tanımlayalım. Bundan sonra da Create user diyerek 2 tanede kullanıcı oluşturalım. Ben mustafa dedim ve rolünü Admin olarak belirledim testuser dedim rolünü User olarak seçtim. Artık elimizde 2 tane farklı role tanımlanmış 2 kullanıcı mevcut. ASP.NET Configuration sayfasını kapatabiliriz artık.
Şimdi panel klasörü içindeki web.config dosyasını açalım ve içeriğini şu şekilde değiştirelim.
<?xml version="1.0"?>
<configuration>
    <system.web>
        <authorization>
            <allow roles="Admin" />
            <deny roles="User" />
<deny users="?" />
            <deny users="*" />
        </authorization>
    </system.web>
</configuration>
Bu dizine erişim yetkilerini allow veya deny diyerek belirtiyoruz. Eğer rol bazlı yetkilendirme yapacaksak
<allow roles="Admin, User" />
<deny roles="Admin, User" />
Şeklinde kullanabiliriz. Ama kullanıcı bazlı yapacaksak.
<allow users="testuser, mustafa"/>
<deny users="testuser, mustafa"/>
Şeklinde erişim yetkilerini belirleyebiliriz. ? işareti login olmayan anonymous kullanıcıları temsil eder. Bizim ilk yaptığımız yetkilendirmede panel klasörüne admin rolündekiler erişebiliyor ama user rolündekiler ve login olmayanlar erişemiyor. Hemen test edelim bakalım…
Şimdi direk panel içindeki default.aspx e gitmek isterseniz sistem sizin login olmanız için şöyle bir adrese yönlendiriyor olması lazım:
http://localhost:3463/login.aspx?ReturnUrl=%2fpanel%2fdefault.aspx
burdaki login.aspx sayfasını web.config dosyasındaki authentication düğümündeki loginUrl ile tanımlamıştık hatırlıyorsanız. Şimdi gelelim Login sayfasını yapmaya… Login sayfamız boş idi. Şimdi sayfamıza bir adet Toolbox> Login > Login kontrolü sürükleyelim. Sayfayı kaydedin ve tekrar panel klasöründeki default.aspx sayfasına girmeye çalışın. Sizi login sayfasına yönlendirecek tekrardan.
Mssql Membership Basit Bir Login Ekranı
Sayfanın son hali şu şekilde olmalı. Kullanıcı adı ve şifremi demin tanımladıklarımdan admin olanınınkilerini giriyorum.
Mssql Membership Basit Bir Admin Paneli
Eğer şifremizi yanlış girmemişseniz görüntüsü yukarıdaki gibi olmalı sayfanızın. Adrese bakarsanız panel içindeki default.aspx olduğunu görürsünüz. Yalnız bide user rolü ile deniyelim. Ama bunun için öncelikle kullanıcının çıkış yapması gerekir. Bunuda gene Toolbox > Login > Login Status kontrolünü yerleştirin. Bu kontrol ne yapar derseniz; kullanıcı eğer giriş yapmış ise çıkış yap(logout), eğer zaten giriş yapmamış veya çıkış yapmış ise giriş yap (login) sayfalarına bağlantıları otomatik oluşturur.
Mssql Membership Basit Bir Admin Paneli - Login Status eklenmiş hali
Sayfama yerleştirdim kontrolümü ve giriş yapmış olduğum için bana Logout (Çıkış Yap) yazısını gösterdi. Eğer Logout yazısını değiştirmek isterseniz “Properties” panelindeki ayarları ile oynayabilirsiniz. Logout a tıkladığımda beni login sayfasına yönlendirecek çıkış işlemi gerçekleştirdiği için.
Şimdide login ekranında testuser kullanıcı ile giriş yapalım. Bu kullanıcıyı User rolüne atamıştık. Bu klasöre yetkisi olmadığı için kullanıcının şifresi doğru bile olsa sürekli login.aspx sayfasına yönderilmesi yapılır gerekli yetkideki bir kullanıcı ile giriş yapması için.
Son olarakta beni hatırla olayının testini yapalım. Tekrar login sayfasına girelim. Öncelikle Login kontrolümüzü seçip Properties penceresindeki RememberMeSet değerini true olarak değiştirin. Admin rolündeki mustafa kullanıcını ve şifresini girelim ve beni hatırlayı(Remember me next time) aktif edelim. Panele giriş yaptıktan sonra http://localhost:3463/panel/default.aspx adresini kopyalayıp browserı kapatın. Browserı açın ve adresi yapıştırın. Göreceksiniz ki direk panele giriş yapmışsınız.
Login kontrolü Properties panelindeki ayarlarında bir sürü değiştirilebilecek ayar var. Bunları inceleyin ve sindirin iyice.
Şimdi sıra yeni kullanıcı kaydında. Ana dizine bir tane register.aspx dosyası oluşturalım. İçine de Toolbox > Login > Create User Wizard kontrolü yerleştirin. Bu sayfayı View In Browser diyerek bir görüntüleyin bakalım.
Mssql Membership Basit Bir Kullanıcı Kayıt Formu
Sayfamız bu şekilde görünmesi gerekiyor. Burdaki yazıları türkçeleştirmek isterseniz eğer kontrolü seçip Properties penceresindeki ayarları ile oynayacaksınız. Eğer dikkat ederseniz tasarım zamanında görünen Security Question ve Security Answer alanları sayfada görünmüyor. Nedeni ise web.configteki membership düğümünde bulunan requiresQuestionAndAnswer değerini false olarak ayarlamamız. Eğer true yaparsak kullanıcı güvenlik sorusu ve cevabıda yazmak zorunda olacak. CreateUserWizard kontrolünün bir dünya özelliği var artık bol bol pratik yapacaksınız Propertiespenceresi ile. Fırsatım olursa ileride değinmeye çalışırım. Fakat önemli bikaç özelliğini de yazayım buraya hemencecik.
LoginCreatedUser: true/false – Kullanıcı oluşturulduğu an login olmuş sayılsın mı?

MailDefinition: Kullanıcı oluşturulduğu anda mail gönderilmesi için burdan ayar yapmalısınız.

Alt Özellikleri

BodyFileName: Şablon olarak kullanılacak txt veya html dosyasının adresi.
EmbeddedObject: Mail ile göndermek istediğiniz ilgili dosyaları burdan ekleyin.
IsBodyHtml: Eğer oluşturduğunuz mail şablonunun içeriği html ise true yapın.

Ve son bir not BodyFileName yani mail şablonu içinde şu şekilde kullanabilirsiniz.

Mail Şablon İçeriği
Merhaba <%UserName%>,
 
Sitemize üye olduğunuz için teşekkür ederiz. Giriş Yapmak için kullanacağınız şifreniz: <b><%Password%></b>’dür
 
Güvenlik Sorunuz: <%PasswordQuestion%>  
Cevabı:   <%PasswordAnswer%> ‘dır
Gibi kullanabilirsiniz. Genel itibari ile Mssql membership oluşturulması ve kullanımı bu şekilde olmaktadır. İleriki zamanlarda Kendi membership ve role providerlarımızla devam ederiz diye umuyorum.

Katkıda Bulunanlar

writeLine (Mustafa GÜLMEZ)

Hiç yorum yok:

Yorum Gönder