Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
tarafından Scott Mitchell
Not
Bu makale yazıldığından beri, ASP.NET Üyelik sağlayıcıları ASP.NET Identitytarafından değiştirildi. Bu makalenin yazıldığı sırada öne çıkan Üyelik sağlayıcıları yerine ASP.NET Identity platformunu kullanacak şekilde uygulamaları güncelleştirmenizi kesinlikle öneririz. ASP.NET Kimliği, ASP.NET Üyelik sistemine göre aşağıdakiler dahil olmak üzere çeşitli avantajlara sahiptir:
- Daha iyi performans
- Geliştirilmiş genişletilebilirlik ve test edilebilirlik
- OAuth, OpenID Connect ve iki öğeli kimlik doğrulaması desteği
- Talep Tabanlı Kimlik desteği
- ASP.Net Core ile daha iyi birlikte çalışabilirlik
Kodu İndir veya PDF'yi İndir
Bu öğretici, SqlMembershipProvider'ı kullanmak için veritabanına gerekli şemayı ekleme tekniklerini inceleyerek başlar. Bundan sonra şemadaki önemli tabloları inceleyecek ve bunların amacını ve önemini tartışacağız. Bu öğretici, ASP.NET bir uygulamaya Üyelik çerçevesinin hangi sağlayıcıyı kullanması gerektiğini nasıl söyleyeceğinizi gösteren bir bakışla sona erer.
Giriş
Önceki iki eğitimde, web sitesi ziyaretçilerini tanımlamak için form kimlik doğrulaması kullanımı incelenmişti. Forms kimlik doğrulama çerçevesi, geliştiricilerin bir web sitesinde kullanıcı oturumunu açmasını ve kimlik doğrulama biletlerinin kullanımı aracılığıyla sayfa ziyaretlerinde bunları anımsamalarını kolaylaştırır.
FormsAuthentication
sınıfı, bileti oluşturmak ve ziyaretçinin çerezlerine eklemek için yöntemler içerir.
FormsAuthenticationModule
tüm gelen istekleri inceler ve geçerli bir kimlik doğrulama biletine sahip olanlar için geçerli istekle bir GenericPrincipal
ve FormsIdentity
nesnesi oluşturur ve ilişkilendirir. Forms kimlik doğrulaması, bir ziyaretçiye oturum açma sırasında kimlik doğrulama bileti vermek ve ardından sonraki isteklerde bu bileti ayrıştırarak kullanıcının kimliğini belirlemek için kullanılan bir mekanizmadır. Bir web uygulamasının kullanıcı hesaplarını desteklemesi için yine de bir kullanıcı deposu uygulamamız ve kimlik bilgilerini doğrulamak, yeni kullanıcıları kaydetmek ve kullanıcı hesabıyla ilgili diğer sayısız görevi kaydetmek için işlevsellik eklememiz gerekir.
ASP.NET 2.0'a başlamadan önce, geliştiriciler kullanıcı hesabıyla ilgili bu görevlerin tümünü uygulamakla ilgilendi. Neyse ki ASP.NET ekibi bu eksikliği fark etti ve ASP.NET 2.0 ile Üyelik çerçevesini tanıttı. Üyelik çerçevesi, .NET Framework'te kullanıcı hesabıyla ilgili temel görevleri gerçekleştirmek için programlı bir arabirim sağlayan bir sınıf kümesidir. Bu çerçeve, geliştiricilerin özelleştirilmiş bir uygulamayı standartlaştırılmış bir API'ye eklemesine olanak tanıyan
Güvenlik Temelleri ve ASP.NET Desteği öğreticisinde açıklandığı gibi.NET Framework iki yerleşik Üyelik sağlayıcısıyla birlikte gönderilir: ActiveDirectoryMembershipProvider
ve SqlMembershipProvider
. Adından da anlaşılacağı gibi, SqlMembershipProvider
kullanıcı deposu olarak bir Microsoft SQL Server veritabanı kullanır. Bu sağlayıcıyı bir uygulamada kullanmak için sağlayıcıya depo olarak hangi veritabanının kullanılacağını söylememiz gerekir. Tahmin edebileceğiniz gibi, SqlMembershipProvider
kullanıcı deposu veritabanının belirli veritabanı tablolarına, görünümlerine ve saklı yordamlarına sahip olmasını bekler. Bu beklenen şemayı seçilen veritabanına eklemeliyiz.
Bu eğitim, SqlMembershipProvider
'ı kullanmak için veritabanına gerekli şemayı ekleme tekniklerini inceleyerek başlar. Bundan sonra şemadaki önemli tabloları inceleyecek ve bunların amacını ve önemini tartışacağız. Bu öğretici, ASP.NET bir uygulamaya Üyelik çerçevesinin hangi sağlayıcıyı kullanması gerektiğini nasıl söyleyeceğinizi gösteren bir bakışla sona erer.
Haydi başlayalım!
1. Adım: Kullanıcı Deposunun Nereye Yerleştirileceğine Karar Verme
bir ASP.NET uygulamasının verileri genellikle veritabanındaki bir dizi tabloda depolanır.
SqlMembershipProvider
veritabanı şemasını uygularken Üyelik şemasını uygulama verileriyle aynı veritabanına mı yoksa alternatif bir veritabanına mı yerleştirebileceğimize karar vermemiz gerekir.
Aşağıdaki nedenlerden dolayı Üyelik şemasını uygulama verileriyle aynı veritabanında bulmanızı öneririm:
- Bakım verileri tek bir veritabanında kapsüllenmiş olan bir uygulamanın anlaşılması, bakımı ve dağıtılması, iki ayrı veritabanı olan bir uygulamadan daha kolaydır.
- üyelikle ilgili tabloları uygulama tablolarıyla aynı veritabanında bularak İlişkisel Bütünlük
Üyelikle ilgili tablolarda ve ilgili uygulama tablolarında birincil anahtarlar arasında yabancı anahtar kısıtlamaları oluşturmak mümkündür.
Kullanıcı deposu ve uygulama verilerini ayrı veritabanlarına ayırmak, yalnızca her birinin ayrı veritabanlarını kullanan ancak ortak bir kullanıcı deposunu paylaşması gereken birden çok uygulamanız varsa mantıklıdır.
Veritabanı Oluşturma
İkinci dersten bu yana geliştirdiğimiz uygulamanın henüz bir veritabanına ihtiyacı yok. Ancak şimdi kullanıcı deposu için bir taneye ihtiyacımız var. Bir tane oluşturalım ve ardından SqlMembershipProvider
sağlayıcısının gerektirdiği şemayı ekleyelim (bkz. 2. Adım).
Not
Bu öğretici serisi boyunca uygulama tablolarımızı ve SqlMembershipProvider
şemasını depolamak için bir Microsoft SQL Server 2005 Express Edition veritabanı kullanacağız. Bu karar iki nedenden dolayı alındı: ilk olarak maliyetinden dolayı - ücretsiz - Express Edition, SQL Server 2005'in en kolay erişilebilir sürümüdür; İkincisi, SQL Server 2005 Express Edition veritabanları doğrudan web uygulamasının App_Data
klasörüne yerleştirilebilir, bu da veritabanını ve web uygulamasını tek bir ZIP dosyasında birlikte paketlemeyi ve özel kurulum yönergeleri veya yapılandırma seçenekleri olmadan yeniden dağıtmayı kolaylaştırır. SQL Server'ın Express Edition olmayan bir sürümünü kullanarak takip etmek isterseniz, çekinmeyin. Adımlar neredeyse aynıdır.
SqlMembershipProvider
şeması, Microsoft SQL Server 2000 ve daha yeni bir sürümüyle çalışır.
Çözüm Gezgini'nden App_Data
klasörüne sağ tıklayın ve Yeni Öğe Ekle'yi seçin. (Projenizde bir App_Data
klasörü görmüyorsanız, Çözüm Gezgini'nde projeye sağ tıklayın, ASP.NET Klasör Ekle'yi seçin ve App_Data
seçin.) Yeni Öğe Ekle iletişim kutusundan SecurityTutorials.mdf
adlı yeni bir SQL Veritabanı eklemeyi seçin. Bu öğreticide bu veritabanına SqlMembershipProvider
şemasını ekleyeceğiz; sonraki öğreticilerde uygulama verilerimizi yakalamak için ek tablolar oluşturacağız.
Şekil 1: App_Data
Klasörüne SecurityTutorials.mdf
Veritabanı Adlı Yeni bir SQL Veritabanı Ekleme (Tam boyutlu görüntüyü görüntülemek için tıklayın)
App_Data
klasörüne veritabanı eklemek, veritabanını otomatik olarak Veritabanı Gezgini görünümüne ekler. (Visual Studio'nun Express Edition olmayan sürümünde, Veritabanı Gezgini Sunucu Gezgini olarak adlandırılır.) Veritabanı Gezgini'ne gidin ve yeni eklenen SecurityTutorials
veritabanını genişletin. Veritabanı Gezgini'ni ekranda görmüyorsanız, Görünüm menüsüne gidin ve Veritabanı Gezgini'ni seçin veya Ctrl+Alt+S tuşlarına basın. Şekil 2'de gösterildiği gibi, SecurityTutorials
veritabanı boş; tablo, görünüm ve saklı yordam içermiyor.
Şekil 2: SecurityTutorials
Veritabanı Şu Anda Boş (Tam boyutlu görüntüyü görüntülemek için tıklayın)
2. Adım:SqlMembershipProvider
Şemasını Veritabanına Ekleme
SqlMembershipProvider
, kullanıcı deposu veritabanına belirli bir tablo, görünüm ve saklı yordam kümesinin yüklenmesini gerektirir. Bu gerekli veritabanı nesneleri%WINDIR%\Microsoft.Net\Framework\v2.0.50727\
klasöründe bulunur.
Not geç, Notka
aspnet_regsql.exe
aracı hem komut satırı işlevselliği hem de grafik kullanıcı arabirimi sunar. Grafik arabirim daha kullanıcı dostudur ve bu öğreticide inceleyeceğiz. Komut satırı arabirimi, derleme betikleri veya otomatik test senaryoları gibi SqlMembershipProvider
şemasının eklenmesi gerektiğinde kullanışlıdır.
SqlMembershipProvider
ve SqlRoleProvider
şemalarını kapsar.
aspnet_regsql.exe
aracına iki bit bilgi sağlamamız gerekir:
- Uygulama hizmetleri eklemek veya kaldırmak isteyip istemediğimiz ve
- Uygulama hizmetleri şemasının ekleneceği veya kaldırılacağı veritabanı
veritabanının kullanılması istendiğinde, aspnet_regsql.exe
aracı veritabanının bulunduğu sunucunun adını, veritabanına bağlanmak için güvenlik kimlik bilgilerini ve veritabanı adını sağlamamızı ister. SQL Server'ın Express olmayan Sürümünü kullanıyorsanız, veritabanıyla ASP.NET bir web sayfası üzerinden çalışırken bağlantı dizesi aracılığıyla sağlamanız gereken bilgilerle aynı olduğundan, bu bilgileri zaten bilmeniz gerekir. Ancak, App_Data
klasöründe SQL Server 2005 Express Edition veritabanı kullanılırken sunucu ve veritabanı adını belirlemek biraz daha önemlidir.
Aşağıdaki bölümde, App_Data
klasöründeki bir SQL Server 2005 Express Edition veritabanı için sunucu ve veritabanı adını belirtmenin basit bir yolu incelenmiştir. SQL Server 2005 Express Edition kullanmıyorsanız Application Services'ı Yükleme bölümüne atlayabilirsiniz.
App_Data
Klasöründe bir SQL Server 2005 Express Edition Veritabanı için Sunucu ve Veritabanı Adını Belirleme
aspnet_regsql.exe
aracını kullanabilmek için sunucu ve veritabanı adlarını bilmemiz gerekir. Sunucu adı localhost\InstanceName
. Büyük olasılıkla, InstanceNameSQLExpress
'dır. Ancak, SQL Server 2005 Express Edition'ı el ile yüklediyseniz (yani, Visual Studio'yu yüklerken otomatik olarak yüklemediyseniz), farklı bir örnek adı seçmiş olmanız mümkündür.
Veritabanı adını belirlemek biraz daha karmaşıktır.
App_Data
klasöründeki veritabanları genellikle veritabanı dosyasının yolu ile birlikte genel olarak benzersiz tanımlayıcı içeren bir veritabanı adına sahiptir. uygulama hizmetleri şemasını aspnet_regsql.exe
aracılığıyla eklemek için bu veritabanı adını belirlememiz gerekir.
Veritabanı adını belirlemenin en kolay yolu, SQL Server Management Studio aracılığıyla incelemektir. SQL Server Management Studio, SQL Server 2005 veritabanlarını yönetmek için grafik arabirim sağlar, ancak SQL Server 2005'in Express Sürümü ile birlikte gelmez. İyi haber, SQL Server Management Studio'nun ücretsiz Express Edition indirebilirsiniz.
Not
Masaüstünüzde SQL Server 2005'in Express Edition olmayan bir sürümü de yüklüyse, Büyük olasılıkla Management Studio'nun tam sürümü yüklüdür. Express Edition için aşağıda açıklanan adımları izleyerek veritabanı adını belirlemek için tam sürümü kullanabilirsiniz.
Veritabanı dosyasında Visual Studio tarafından uygulanan tüm kilitlerin kapatıldığından emin olmak için Visual Studio'yu kapatarak başlayın. Ardından SQL Server Management Studio'yu başlatın ve SQL Server 2005 Express Edition için localhost\InstanceName
veritabanına bağlanın. Daha önce belirtildiği gibi, örnek adının SQLExpress
olma olasılığı vardır. Kimlik Doğrulaması seçeneği için Windows Kimlik Doğrulaması'nı seçin.
Şekil 3: SQL Server 2005 Express Edition Örneğine Bağlanma (Tam boyutlu görüntüyü görüntülemek için tıklayın)
SQL Server 2005 Express Edition örneğine bağlandıktan sonra, Management Studio Veritabanları, Güvenlik ayarları, Sunucu Nesneleri vb. için klasörleri görüntüler. Veritabanları sekmesini genişletirseniz, SecurityTutorials.mdf
veritabanının veritabanı örneğinde kayıtlı olmadığını görürsünüz; önce veritabanını eklememiz gerekir.
Veritabanları klasörüne sağ tıklayın ve bağlam menüsünden Ekle'yi seçin. Bu, Veritabanlarını Ekle iletişim kutusunu görüntüler. Buradan Ekle düğmesine tıklayın, SecurityTutorials.mdf
veritabanına gidin ve Tamam'a tıklayın. Şekil 4'de, SecurityTutorials.mdf
veritabanı seçildikten sonra Veritabanları ekle iletişim kutusu gösterilmektedir. Şekil 5'de veritabanı başarıyla eklendikten sonra Management Studio'nun Nesne Gezgini gösterilmektedir.
Şekil 4: SecurityTutorials.mdf
Veritabanını Ekleme (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Şekil 5: SecurityTutorials.mdf
Veritabanı Veritabanları Klasöründe Görünür (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Şekil 5'in gösterdiği gibi, SecurityTutorials.mdf
veritabanının adı oldukça anlaşılması zordur. Şimdi bunu daha akılda kalıcı (ve daha kolay yazılan) bir adla değiştirelim. Veritabanına sağ tıklayın, bağlam menüsünden Yeniden Adlandır'ı seçin ve SecurityTutorialsDatabase
yeniden adlandırın. Bu işlem dosya adını değiştirmez, yalnızca veritabanının kendisini SQL Server olarak tanımlamak için kullandığı adı değiştirir.
Şekil 6: Veritabanını SecurityTutorialsDatabase
olarak yeniden adlandırın (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Bu noktada, SecurityTutorials.mdf
veritabanı dosyasının sunucu ve veritabanı adlarını biliyoruz: sırasıyla localhost\InstanceName
ve SecurityTutorialsDatabase
. Artık aspnet_regsql.exe
aracı aracılığıyla uygulama hizmetlerini yüklemeye hazırız.
Uygulama Hizmetlerini Yükleme
aspnet_regsql.exe
aracını başlatmak için başlat menüsüne gidin ve Çalıştır'ı seçin. Metin kutusuna %WINDIR%\Microsoft.Net\Framework\v2.0.50727\aspnet_regsql.exe
girin ve Tamam'a tıklayın. Alternatif olarak, Windows Gezgini'ni kullanarak uygun klasöre gidebilir ve aspnet_regsql.exe
dosyasına çift tıklayabilirsiniz. Her iki yaklaşım da aynı sonuçları elde eder.
aspnet_regsql.exe
aracını herhangi bir komut satırı bağımsız değişkeni olmadan çalıştırmak ASP.NET SQL Server Kurulum Sihirbazı grafik kullanıcı arabirimini başlatır. Sihirbaz, belirtilen veritabanındaki ASP.NET uygulama hizmetlerini eklemeyi veya kaldırmayı kolaylaştırır. Şekil 7'de gösterilen sihirbazın ilk ekranı aracın amacını açıklar.
Şekil 7: Üyelik Şeması eklemek için ASP.NET SQL Server Kurulum Sihirbazı'nı kullanın (Tam boyutlu görüntüyü görüntülemek için tıklayın).
Sihirbazdaki ikinci adım, uygulama hizmetlerini eklemek mi yoksa kaldırmak mı istediğimizi sorar.
SqlMembershipProvider
için gerekli tabloları, görünümleri ve saklı yordamları eklemek istediğimizden, Uygulama hizmetleri için SQL Server'ı yapılandır seçeneğini belirleyin. Daha sonra, bu şemayı veritabanınızdan kaldırmak istiyorsanız, bu sihirbazı yeniden çalıştırın, ancak bunun yerine Varolan bir veritabanından uygulama hizmetleri bilgilerini kaldır seçeneğini belirleyin.
Şekil 8: Application Services için SQL Server'ı Yapılandırma Seçeneğini Seçin (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Üçüncü adım veritabanı bilgilerini ister: sunucu adı, kimlik doğrulama bilgileri ve veritabanı adı. Bu öğreticiyle birlikte takip ettiyseniz ve SecurityTutorials.mdf
veritabanını App_Data
ekleyip localhost\InstanceName
'ye eklediyseniz ve SecurityTutorialsDatabase
olarak yeniden adlandırdıysanız, aşağıdaki değerleri kullanın:
- Sunucu:
localhost\InstanceName
- Windows kimlik doğrulaması
- Veritabanı:
SecurityTutorialsDatabase
Şekil 9: Veritabanı Bilgilerini girin (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Veritabanı bilgilerini girdikten sonra İleri'ye tıklayın. Son adım, atılacak adımları özetler. Uygulama hizmetlerini yüklemek için İleri'ye tıklayın ve sonra sihirbazı tamamlamak için Son'a tıklayın.
Not
Veritabanını eklemek ve veritabanı dosyasını yeniden adlandırmak için Management Studio kullandıysanız Visual Studio'yu yeniden açmadan önce veritabanını ayırdığınızdan ve Management Studio'yu kapatdığınızdan emin olun.
SecurityTutorialsDatabase
veritabanını ayırmak için veritabanı adına sağ tıklayın ve Görevler menüsünden Ayır'ı seçin.
Sihirbazı tamamlayıp Visual Studio'ya dönün ve Veritabanı Gezgini'ne gidin. Tablolar klasörünü genişletin. adları aspnet_
ön ekiyle başlayan bir dizi tablo görmeniz gerekir. Benzer şekilde, Görünümler ve Saklı Yordamlar klasörlerinin altında çeşitli görünümler ve saklı yordamlar bulunabilir. Bu veritabanı nesneleri uygulama hizmetleri şemasını oluşturur. 3. Adımda üyelik ve role özgü veritabanı nesnelerini inceleyeceğiz.
Çeşitli Tablolar, Görünümler ve Saklı Yordamlar Eklendi
Şekil 10: Veritabanına Çeşitli Tablolar, Görünümler ve Saklı Yordamlar Eklendi (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Not
aspnet_regsql.exe
aracının grafik kullanıcı arabirimi, uygulama hizmetleri şemasının tamamını yükler. Ancak komut satırından aspnet_regsql.exe
yürütürken hangi uygulama hizmetleri bileşenlerinin yükleneceğini (veya kaldırılacağını) belirtebilirsiniz. Bu nedenle, yalnızca SqlMembershipProvider
ve SqlRoleProvider
sağlayıcıları için gerekli tabloları, görünümleri ve saklı yordamları eklemek istiyorsanız, komut satırından aspnet_regsql.exe
çalıştırın. Alternatif olarak, aspnet_regsql.exe
tarafından kullanılan T-SQL oluşturma betiklerinin uygun alt kümesini el ile çalıştırabilirsiniz. Bu betikler, InstallCommon.sql
, InstallMembership.sql
, InstallRoles.sql
, InstallProfile.sql
, InstallSqlState.sql
gibi adlarla WINDIR%\Microsoft.Net\Framework\v2.0.50727\
klasöründe bulunur.
Bu noktada, SqlMembershipProvider
tarafından gereken veritabanı nesnelerini oluşturduk. Ancak yine de Üyelik sistemine SqlMembershipProvider
'ı (örneğin, ActiveDirectoryMembershipProvider
yerine) kullanması ve SqlMembershipProvider
'nin SecurityTutorials
veritabanını kullanması gerektiğini bildirmemiz gerekir. 4. Adım'da hangi sağlayıcının kullanılacağını belirtme ve seçili sağlayıcı ayarlarını özelleştirme adımlarını inceleyeceğiz. Ancak ilk olarak, yeni oluşturulan veritabanı nesnelerine daha ayrıntılı bir göz atalım.
3. Adım: Şemanın Çekirdek Tablolarına Bakış
bir ASP.NET uygulamasında Üyelik ve Roller çerçeveleriyle çalışırken uygulama ayrıntıları sağlayıcı tarafından kapsüllenir. Gelecek öğreticilerde.NET Framework'ün Membership
ve Roles
sınıfları aracılığıyla bu çerçevelerle arabirim oluştururuz. Bu üst düzey API'leri kullanırken, hangi sorguların yürütüldiği veya hangi tabloların SqlMembershipProvider
ve SqlRoleProvider
tarafından değiştirildiği gibi alt düzey ayrıntılarla ilgilenmemiz gerekmez.
Bunu göz önünde bulundurarak, 2. Adımda oluşturulan veritabanı şemasını keşfetmeden Üyelik ve Roller çerçevelerini güvenle kullanabiliriz. Ancak, uygulama verilerini depolamak için tabloları oluştururken kullanıcılar veya rollerle ilgili varlıklar oluşturmamız gerekebilir. Uygulama veri tabloları ile 2. Adımda oluşturulan tablolar arasında yabancı anahtar kısıtlamaları oluştururken SqlMembershipProvider
ve SqlRoleProvider
şemaları hakkında bilgi sahibi olmanıza yardımcı olur. Ayrıca, bazı nadir durumlarda kullanıcı ve rol depoları ile doğrudan veritabanı düzeyinde arabirim oluşturmamız gerekebilir (Membership
veya Roles
sınıfları yerine).
Kullanıcı Depoyu Uygulamalara Bölümleme
Üyelik ve Roller çerçeveleri, tek bir kullanıcı ve rol deposunun birçok farklı uygulama arasında paylaşılabilmesi için tasarlanmıştır. Üyelik veya Roller çerçevelerini kullanan bir ASP.NET uygulaması hangi uygulama bölümünün kullanılacağını belirtmelidir. Kısacası, birden çok web uygulaması aynı kullanıcı ve rol depolarını kullanabilir. Şekil 11'de üç uygulamaya ayrılmış kullanıcı ve rol depoları gösterilmektedir: HRSite, CustomerSite ve SalesSite. Bu üç web uygulamasının kendi benzersiz kullanıcıları ve rolleri vardır, ancak bunların hepsi kullanıcı hesabını ve rol bilgilerini aynı veritabanı tablolarında fiziksel olarak depolar.
Şekil 11: Kullanıcı Hesapları Birden Çok Uygulamada Bölümlenebilir (Tam boyutlu görüntüyü görüntülemek için tıklayın)
bu bölümleri tanımlayan aspnet_Applications
tablosudur. Kullanıcı hesabı bilgilerini depolamak için veritabanını kullanan her uygulama bu tablodaki bir satırla temsil edilir.
aspnet_Applications
tablosunda dört sütun vardır: ApplicationId
, ApplicationName
, LoweredApplicationName
ve Description
.
ApplicationId
uniqueidentifier
türündedir ve tablonun birincil anahtarıdır; ApplicationName
her uygulama için benzersiz bir insan dostu ad sağlar.
Üyelik ve Rolle ilgili diğer tablolar, aspnet_Applications
içindeki ApplicationId
alanına geri bağlanır. Örneğin, her kullanıcı hesabı için bir kayıt içeren aspnet_Users
tablosunun ApplicationId
yabancı anahtar alanı vardır; aspnet_Roles
tablosu için ditto. Bu tablolardaki ApplicationId
alanı, kullanıcı hesabının veya rolün ait olduğu uygulama bölümünü belirtir.
Kullanıcı Hesabı Bilgilerini Depolama
Kullanıcı hesabı bilgileri iki tabloda yer alır: aspnet_Users
ve aspnet_Membership
.
aspnet_Users
tablosu, temel kullanıcı hesabı bilgilerini barındıran alanlar içerir. En ilgili üç sütun şunlardır:
UserId
UserName
ApplicationId
UserId
birincil anahtardır (ve uniqueidentifier
türündedir).
UserName
nvarchar(256)
türündedir ve parolayla birlikte kullanıcının kimlik bilgilerini oluşturur. (Kullanıcının parolası aspnet_Membership
tablosunda depolanır.) ApplicationId
, kullanıcı hesabını aspnet_Applications
'daki belirli bir uygulamaya bağlar.
UserName
ve ApplicationId
sütunlarında bileşik UNIQUE
kısıtlama vardır. Bu, belirli bir uygulamada her UserName'in benzersiz olmasını sağlar, ancak aynı UserName
farklı uygulamalarda kullanılmasına izin verir.
aspnet_Membership
tablosu kullanıcının parolası, e-posta adresi, son oturum açma tarihi ve saati gibi ek kullanıcı hesabı bilgilerini içerir.
aspnet_Users
ve aspnet_Membership
tablolarındaki kayıtlar arasında bire bir yazışma vardır. Bu ilişki, tablonun birincil anahtarı olarak görev yapan aspnet_Membership
içindeki UserId
alanı tarafından sağlanır.
aspnet_Users
tablosu gibi aspnet_Membership
de bu bilgileri belirli bir uygulama bölümüyle bağlayan bir ApplicationId
alanı içerir.
Parolaların Güvenliğini Sağlama
Parola bilgileri aspnet_Membership
tablosunda depolanır.
SqlMembershipProvider
, aşağıdaki üç teknikten birini kullanarak parolaların veritabanında depolanmasını sağlar:
- Temizle: Parola veritabanında düz metin olarak depolanır. Bu seçeneği kullanmak kesinlikle önerilmez. Veritabanının güvenliği aşıldıysa - bu, arka kapı bulan bir bilgisayar korsanı veya veritabanı erişimine sahip kızgın bir çalışan tarafından olabilir - her kullanıcının kimlik bilgileri ele geçirilebilir.
- Karma - Parolalar tek yönlü karma algoritması ve rastgele oluşturulan bir tuz değeri ile karma yapılır. Bu karma değer (tuzla birlikte) veritabanında depolanır.
- Encrypted - parolanın şifrelenmiş bir sürümü veritabanında depolanır.
Kullanılan parola depolama tekniği, Web.config
içinde belirtilen SqlMembershipProvider
ayarlarına bağlıdır. 4. Adımda SqlMembershipProvider
ayarlarını özelleştirmeyi inceleyeceğiz. Varsayılan davranış, parola karması depolamaktır.
Parolayı depolamak için sorumlu sütunlar Password
, PasswordFormat
ve PasswordSalt
.
PasswordFormat
, değeri parolayı depolamak için kullanılan tekniği belirten int
türünde bir alandır: Açık için 0; Karma için 1; Şifreli için 2.
PasswordSalt
, kullanılan parola depolama tekniğinden bağımsız olarak rastgele oluşturulmuş bir dize atanır; PasswordSalt
değeri yalnızca parola karması hesaplanırken kullanılır. Son olarak, Password
sütunu düz metin parola, parola karması veya şifrelenmiş parola gibi gerçek parola verilerini içerir.
Tablo 1'de, MySecret parolasını depolarken bu üç sütunun çeşitli depolama teknikleri için nasıl görünebileceği gösterilmektedir! .
Depolama Tekniği<_o3a_p /> | Parola<_o3a_p /> | PasswordFormat<_o3a_p /> | PasswordSalt<_o3a_p /> |
---|---|---|---|
Berrak | MySecret! | 0 | tTnkPlesqissc2y2SMEygA== |
Karma | 2oXm6sZHWbTHFgjgkGQsc2Ec9ZM= | 1 | wFgjUfhdUFOCKQiI61vtiQ== |
Şifrelenmiş | 62RZgDvhxykkqsMchZ0Yly7HS6onhpaoCYaRxV8g0F4CW56OXUU3e7Inza9j9BKp | 2 | LSRzhGS/aa/oqAXGLHJNBw== |
Tablo 1: MySecret Parolasını Depolarken Password-Related Alanları için Örnek Değerler!
Not
SqlMembershipProvider
tarafından kullanılan belirli şifreleme veya karma algoritması, <machineKey>
öğesindeki ayarlar tarafından belirlenir.
Rolleri ve Rol İlişkilendirmelerini Depolama
Roller çerçevesi, geliştiricilerin bir rol kümesi tanımlamasına ve hangi kullanıcıların hangi rollere ait olduğunu belirtmesine olanak tanır. Bu bilgiler veritabanında iki tablo aracılığıyla yakalanır: aspnet_Roles
ve aspnet_UsersInRoles
.
aspnet_Roles
tablosundaki her kayıt, belirli bir uygulama için bir rolü temsil eder.
aspnet_Users
tablosuna çok benzer şekilde, aspnet_Roles
tablosunun tartışmamıza ilişkin üç sütunu vardır:
RoleId
RoleName
ApplicationId
RoleId
birincil anahtardır (ve uniqueidentifier
türündedir).
RoleName
nvarchar(256)
türündedir.
ApplicationId
kullanıcı hesabını aspnet_Applications
'deki belirli bir uygulamaya bağlar.
RoleName
ve ApplicationId
sütunlarında bileşik UNIQUE
kısıtlaması vardır ve belirli bir uygulamada her rol adının benzersiz olmasını sağlar.
aspnet_UsersInRoles
tablosu, kullanıcılar ve roller arasında bir eşleme görevi görür. yalnızca iki sütun vardır: UserId
ve RoleId
ve birlikte bileşik bir birincil anahtar oluştururlar.
4. Adım: Sağlayıcıyı Belirtme ve Ayarlarını Özelleştirme
Üyelik ve Roller çerçeveleri gibi sağlayıcı modelini destekleyen tüm çerçevelerde uygulama ayrıntıları eksiktir ve bunun yerine bu sorumluluğu bir sağlayıcı sınıfına devredebilirsiniz. Üyelik çerçevesi söz konusu olduğunda, Membership
sınıfı kullanıcı hesaplarını yönetmek için API'yi tanımlar, ancak herhangi bir kullanıcı deposuyla doğrudan etkileşim kurmaz. Bunun yerine, Membership
sınıfının yöntemleri isteği yapılandırılan sağlayıcıya teslim eder- SqlMembershipProvider
kullanacağız.
Membership
sınıfındaki yöntemlerden birini çağırdığımızda, Üyelik çerçevesi çağrıyı SqlMembershipProvider
'e devretmeyi nasıl bilir?
Membership
sınıfı, Üyelik çerçevesi tarafından kullanılabilen tüm kayıtlı sağlayıcı sınıflarına referans içeren Providers
özelliği'e sahiptir. Her kayıtlı sağlayıcının ilişkili bir adı ve türü vardır. Ad, Providers
koleksiyonundaki belirli bir sağlayıcıya başvurmak için insan dostu bir yol sunarken tür sağlayıcı sınıfını tanımlar. Ayrıca, her kayıtlı sağlayıcı yapılandırma ayarlarını içerebilir. Üyelik çerçevesinin yapılandırma ayarları arasında PasswordFormat
ve requiresUniqueEmail
bulunur.
SqlMembershipProvider
tarafından kullanılan yapılandırma ayarlarının tam listesi için bkz. Tablo 2.
Providers
özelliğinin içeriği web uygulamasının yapılandırma ayarları aracılığıyla belirtilir. Varsayılan olarak, tüm web uygulamaları SqlMembershipProvider
türünde AspNetSqlMembershipProvider
adlı bir sağlayıcıya sahiptir. Bu varsayılan üyelik sağlayıcısı machine.config
, %WINDIR%\Microsoft.Net\Framework\v2.0.50727\CONFIG
konumunda kayıtlıdır.
Uyarı
Aradığınız örnek taşınmış gibi görünüyor! Bu sorunu çözmek için çalıştığımızdan emin olabilirsiniz.
Yukarıdaki işaretlemede gösterildiği gibi, <membership>
öğesi Üyelik çerçevesinin yapılandırma ayarlarını tanımlarken, <providers>
alt öğesi kayıtlı sağlayıcıları belirtir. Sağlayıcılar <add>
veya <remove>
öğeleri kullanılarak eklenebilir veya kaldırılabilir; şu anda kayıtlı olan tüm sağlayıcıları kaldırmak için <clear>
öğesini kullanın. Yukarıdaki işaretlemede gösterildiği gibi, machine.config
SqlMembershipProvider
türünde AspNetSqlMembershipProvider
adlı bir sağlayıcı ekler.
name
ve type
özniteliklerine ek olarak, <add>
öğesi çeşitli yapılandırma ayarları için değerleri tanımlayan öznitelikler içerir. Tablo 2'de kullanılabilir SqlMembershipProvider
özel yapılandırma ayarlarının yanı sıra her birinin açıklaması listelenir.
Not
Tablo 2'de belirtilen tüm varsayılan değerler, SqlMembershipProvider
sınıfında tanımlanan varsayılan değerlere başvurur.
AspNetSqlMembershipProvider
içindeki yapılandırma ayarlarının tümünün SqlMembershipProvider
sınıfının varsayılan değerlerine karşılık gelmediğine dikkat edin. Örneğin, üyelik sağlayıcısında belirtilmezse, requiresUniqueEmail
ayarı varsayılan olarak true olur. Ancak, AspNetSqlMembershipProvider
açıkça false
değerini belirterek bu varsayılan değeri geçersiz kılar.
Ayarı<_o3a_p /> | Açıklama<_o3a_p /> |
---|---|
ApplicationName |
Üyelik çerçevesinin tek bir kullanıcı deposunun birden çok uygulama arasında bölümlendirilmesine olanak tanıdığını hatırlayın. Bu ayar, Üyelik sağlayıcısı tarafından kullanılan uygulama bölümünün adını gösterir. Bu değer açıkça belirtilmezse, çalışma zamanında uygulamanın sanal kök yolunun değerine ayarlanır. |
commandTimeout |
SQL komut zaman aşımı değerini belirtir (saniye olarak). Varsayılan değer 30'dur. |
connectionStringName |
Kullanıcı deposu veritabanına bağlanmak için kullanılacak <connectionStrings> öğesindeki bağlantı dizesinin adı. Bu değer gereklidir. |
description |
Kayıtlı sağlayıcının insan dostu bir açıklamasını sağlar. |
enablePasswordRetrieval |
Kullanıcıların unutulan parolalarını alıp alamayacağını belirtir. Varsayılan değer false . |
enablePasswordReset |
Kullanıcıların parolalarını sıfırlamasına izin verilip verilmeyeceğini gösterir. varsayılan olarak true . |
maxInvalidPasswordAttempts |
Kullanıcı kilitlenmeden önce belirtilen passwordAttemptWindow sırasında belirli bir kullanıcı için gerçekleşebilecek başarısız oturum açma girişimi sayısı üst sınırı. Varsayılan değer 5'tir. |
minRequiredNonalphanumericCharacters |
Kullanıcının parolasında görünmesi gereken en az alfasayısal olmayan karakter sayısı. Bu değer 0 ile 128 arasında olmalıdır; varsayılan değer 1'dir. |
minRequiredPasswordLength |
Parolada gereken en az karakter sayısı. Bu değer 0 ile 128 arasında olmalıdır; varsayılan değer 7'dir. |
name |
Kayıtlı sağlayıcının adı. Bu değer gereklidir. |
passwordAttemptWindow |
Başarısız oturum açma girişimlerinin izlendiği dakika sayısı. Bir kullanıcı bu belirtilen pencere içinde maxInvalidPasswordAttempts kez geçersiz oturum açma kimlik bilgileri sağlarsa, bu kimlik bilgileri kilitlenir. Varsayılan değer 10'dur. |
PasswordFormat |
Parola depolama biçimi: Clear , Hashed veya Encrypted . Varsayılan değer Hashed . |
passwordStrengthRegularExpression |
Bu normal ifade sağlanırsa, yeni bir hesap oluştururken veya parolasını değiştirirken kullanıcının seçtiği parolanın gücünü değerlendirmek için kullanılır. Varsayılan değer boş bir dizedir. |
requiresQuestionAndAnswer |
Kullanıcının parolasını alırken veya sıfırlarken güvenlik sorusunu yanıtlaması gerekip gerekmediğini belirtir. Varsayılan değer true . |
requiresUniqueEmail |
Belirli bir uygulama bölümündeki tüm kullanıcı hesaplarının benzersiz bir e-posta adresine sahip olması gerekip gerekmediğini gösterir. Varsayılan değer true . |
type |
Sağlayıcının türünü belirtir. Bu değer gereklidir. |
Tablo 2: Üyelik ve SqlMembershipProvider
Yapılandırma Ayarları
AspNetSqlMembershipProvider
ek olarak, diğer Üyelik sağlayıcıları, her bir uygulama için Web.config
dosyasına benzer işaretlemeler eklenerek kaydedilebilir.
Not
Roller çerçevesi de aynı şekilde çalışır: machine.config
'da varsayılan kayıtlı rol sağlayıcısı vardır ve kayıtlı sağlayıcılar Web.config
'de uygulama bazında özelleştirilebilir. Roller çerçevesini ve yapılandırma işaretlemesini gelecekteki bir öğreticide ayrıntılı olarak inceleyeceğiz.
SqlMembershipProvider
Ayarlarını Özelleştirme
Varsayılan SqlMembershipProvider
(AspNetSqlMembershipProvider
) connectionStringName
özniteliği LocalSqlServer
olarak ayarlanmıştır.
AspNetSqlMembershipProvider
sağlayıcısı gibi, LocalSqlServer
bağlantı dizesi adı da machine.config
içinde tanımlanır.
Uyarı
Aradığınız örnek taşınmış gibi görünüyor! Bu sorunu çözmek için çalıştığımızdan emin olabilirsiniz.
Gördüğünüz gibi, bu bağlantı dizesi | konumunda bulunan bir SQL 2005 Express Edition veritabanını tanımlarDataDirectory|aspnetdb.mdf. |DataDirectory| dizesi, çalışma zamanında ~/App_Data/
dizinine işaret edecek şekilde çevrilir; bu nedenle, veritabanı yolu |DataDirectory|aspnetdb.mdf, ~/App_Data
/aspnet.mdf
olarak çevrilir.
Uygulamamızın Web.config
dosyasında Üyelik sağlayıcısı bilgisi belirtmediysek, uygulama varsayılan kayıtlı Üyelik sağlayıcısını kullanır AspNetSqlMembershipProvider
.
~/App_Data/aspnet.mdf
veritabanı yoksa, ASP.NET çalışma zamanı veritabanını otomatik olarak oluşturur ve uygulama hizmetleri şemasını ekler. Ancak, aspnet.mdf
veritabanını kullanmak istemiyoruz; bunun yerine, 2. Adımda oluşturduğumuz SecurityTutorials.mdf
veritabanını kullanmak istiyoruz. Bu değişiklik iki yoldan biriyle gerçekleştirilebilir:
bağlantı dizesi adı için bir değer belirtin. bağlantı dizesi adı değerinin üzerine yazarak, varsayılan kayıtlı Üyelik sağlayıcısını ( ) kullanabilir ve veritabanıyla düzgün çalışmasını sağlayabiliriz. AspNetSqlMembershipProvider
tarafından belirtilen yapılandırma ayarlarıyla memnunsanız bu yaklaşım uygundur. Bu teknik hakkında daha fazla bilgi için bkz. Scott Guthrie'ın blog gönderisiASP.NET 2.0 Uygulama Hizmetlerini SQL Server 2000 veya SQL Server 2005 Kullanacak Şekilde Yapılandırma.-
SqlMembershipProvider
türünde yeni bir kayıtlı sağlayıcı ekleyin veconnectionStringName
ayarınıSecurityTutorials.mdf
veritabanına işaret eden şekilde yapılandırın. Bu yaklaşım, veritabanı bağlantı dizesine ek olarak diğer yapılandırma özelliklerini özelleştirmek istediğiniz senaryolarda kullanışlıdır. Kendi projelerimde her zaman esnekliği ve okunabilirliği nedeniyle bu yaklaşımı kullanıyorum.
SecurityTutorials.mdf
veritabanına başvuran yeni bir kayıtlı sağlayıcı ekleyebilmek için önce Web.config
<connectionStrings>
bölümüne uygun bir bağlantı dizesi değeri eklememiz gerekir. Aşağıdaki işaretleme, App_Data
klasöründeki SQL Server 2005 Express Edition SecurityTutorials.mdf
veritabanına başvuran SecurityTutorialsConnectionString
adlı yeni bir bağlantı dizesi ekler.
Uyarı
Aradığınız örnek taşınmış gibi görünüyor! Bu sorunu çözmek için çalıştığımızdan emin olabilirsiniz.
Not
Alternatif bir veritabanı dosyası kullanıyorsanız, bağlantı dizesini gerektiği gibi güncelleştirin. Doğru bağlantı dizesini oluşturma hakkında daha fazla bilgi için bkz. ConnectionStrings.com.
Ardından, Web.config
dosyasına aşağıdaki Üyelik yapılandırma işaretlemesini ekleyin. Bu işaretleme, SecurityTutorialsSqlMembershipProvider
adlı yeni bir sağlayıcı kaydeder.
Uyarı
Aradığınız örnek taşınmış gibi görünüyor! Bu sorunu çözmek için çalıştığımızdan emin olabilirsiniz.
Yukarıdaki işaretleme, SecurityTutorialsSqlMembershipProvider
sağlayıcısını kaydetmeye ek olarak SecurityTutorialsSqlMembershipProvider
varsayılan sağlayıcı olarak tanımlar (<membership>
öğesindeki defaultProvider
özniteliği aracılığıyla). Üyelik çerçevesinin birden çok kayıtlı sağlayıcıya sahip olabileceğini hatırlayın.
AspNetSqlMembershipProvider
, machine.config
'da ilk sağlayıcı olarak kaydedildiğinden, aksini belirtmediğimiz sürece varsayılan sağlayıcı olarak hizmet verir.
Şu anda uygulamamızda iki kayıtlı sağlayıcı vardır: AspNetSqlMembershipProvider
ve SecurityTutorialsSqlMembershipProvider
. Ancak, SecurityTutorialsSqlMembershipProvider
sağlayıcısını kaydetmeden önce, <add>
öğemizden hemen önce bir <clear />
öğesi ekleyerek daha önce kaydedilmiş tüm sağlayıcıları temizlemiş olabilirdik. Bu, kayıtlı sağlayıcılar listesinden AspNetSqlMembershipProvider
temizler, yani SecurityTutorialsSqlMembershipProvider
tek kayıtlı Üyelik sağlayıcısı olur. Bu yaklaşımı kullandıysak, tek kayıtlı Üyelik sağlayıcısı olacağından SecurityTutorialsSqlMembershipProvider
varsayılan sağlayıcı olarak işaretlememiz gerekmez.
<clear />
kullanma hakkında daha fazla bilgi için bkz. Sağlayıcı eklerken <clear />
kullanma.
SecurityTutorialsSqlMembershipProvider
'ün connectionStringName
ayarının yeni eklenen SecurityTutorialsConnectionString
bağlantı dizesi adına referans verdiğini ve applicationName
ayarının SecurityTutorials değerine ayarlandığını unutmayın. Ayrıca, requiresUniqueEmail
ayarı true
olarak ayarlanmıştır. Diğer tüm yapılandırma seçenekleri AspNetSqlMembershipProvider
içindeki değerlerle aynıdır. İsterseniz burada herhangi bir yapılandırma değişikliği yapabilirsiniz. Örneğin, bir yerine iki alfasayısal olmayan karakter gerektirerek veya parola uzunluğunu yedi yerine sekiz karaktere çıkararak parola gücünü artırabilirsiniz.
Not
Üyelik çerçevesinin tek bir kullanıcı deposunun birden çok uygulama arasında bölümlendirilmesine olanak tanıdığını hatırlayın. Üyelik sağlayıcısının applicationName
ayarı, sağlayıcının kullanıcı deposuyla çalışırken hangi uygulamayı kullandığını gösterir.
applicationName
yapılandırma ayarı için açıkça bir değer ayarlamanız önemlidir, çünkü applicationName
açıkça ayarlanmazsa, çalışma zamanında web uygulamasının sanal kök yoluna atanır. Uygulamanın sanal kök yolu değişmediği sürece bu işlem düzgün çalışır, ancak uygulamayı farklı bir yola taşırsanız, applicationName
ayarı da değişir. Bu durumda Üyelik sağlayıcısı daha önce kullanılandan farklı bir uygulama bölümüyle çalışmaya başlar. Taşımadan önce oluşturulan kullanıcı hesapları farklı bir uygulama bölümünde yer alır ve bu kullanıcılar artık sitede oturum açamaz. Bu konuyla ilgili daha ayrıntılı bir tartışma için, bkz. ASP.NET 2.0 Üyesi ve diğer sağlayıcılar yapılandırılırken applicationName
özelliğini her zaman ayarlayın.
Özet
Bu noktada, yapılandırılmış uygulama hizmetlerini (SecurityTutorials.mdf
) içeren bir veritabanımız var ve Web uygulamamızı, Üyelik çerçevesinin yeni kaydettiğimiz SecurityTutorialsSqlMembershipProvider
sağlayıcısını kullanacak şekilde yapılandırdık. Bu kayıtlı sağlayıcı SqlMembershipProvider
türündedir ve connectionStringName
, uygun bağlantı dizesi (SecurityTutorialsConnectionString
) için ayarlanmıştır ve applicationName
değeri açıkça ayarlanmıştır.
Artık uygulamamızdan Üyelik çerçevesini kullanmaya hazırız. Sonraki öğreticide yeni kullanıcı hesaplarının nasıl oluşturulacağını inceleyeceğiz. Bunun ardından kullanıcıların kimliğini doğrulamayı, kullanıcı tabanlı yetkilendirme gerçekleştirmeyi ve kullanıcıyla ilgili ek bilgileri veritabanında depolamayı keşfedeceğiz.
Mutlu Programlama!
Daha Fazla Okuma
Bu öğreticide ele alınan konular hakkında daha fazla bilgi için aşağıdaki kaynaklara bakın:
-
ASP.NET 2.0 Üyeliğini yapılandırırken
applicationName
Özelliğini ve Diğer Sağlayıcıları Her Zaman Ayarlayın - SQL Server 2000 veya SQL Server 2005 Kullanmak için ASP.NET 2.0 Uygulama Hizmetlerini Yapılandırma
- SQL Server Management Studio'ı indirin
- ASP.NET 2.0'un Üyelik, Roller ve Profilini İnceleme
- Üyelik sağlayıcıları için
Öğe -
<membership>
Öğesi -
Üyelik için
<providers>
Öğesi -
Sağlayıcı eklerken
<clear />
kullanımı - doğrudan
ile çalışma
Bu Öğreticide Yer Alan Konulara Yönelik Video Eğitimi
Yazar Hakkında
Birden çok ASP/ASP.NET kitabının yazarı ve 4GuysFromRolla.com kurucusu Scott Mitchell, 1998'den beri Microsoft Web teknolojileriyle çalışmaktadır. Scott bağımsız bir danışman, eğitmen ve yazar olarak çalışır. Son kitabı Sams Teach Yourself ASP.NET 2.0 24 Saatte. Scott'a mitchell@4guysfromrolla.com adresinden veya http://ScottOnWriting.NETadresinden blogundan ulaşabilirsiniz.
Özel Teşekkürler
Bu eğitim serisi, birçok yararlı kişi tarafından incelendi. Bu öğreticinin baş gözden geçireni Alicja Maziarz'dı. Yaklaşan MSDN makalelerimi gözden geçirmek istiyor musunuz? Öyleyse, mitchell@4GuysFromRolla.com'a bir mesaj bırakın.