Aracılığıyla paylaş


SQL Server'da Üyelik Şeması Oluşturma (C#)

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ğitim, web sitesi ziyaretçilerini tanımak için form kimlik doğrulaması kullanma konusunu ele aldı. 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şturma ve ziyaretçinin çerezlerine ekleme yöntemlerini 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ı, sadece bir ziyaretçiye oturum açarken kimlik doğrulama bileti vermek ve sonraki taleplerde 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ıyansağlayıcı modelinin üzerine kurulmuştur.

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 kılavuz, SqlMembershipProviderkullanmak 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:

  • Maintainability verileri tek bir veritabanında kapsüllenmiş olan bir uygulamanın anlaşılması, bakımı ve dağıtımı, 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 oluşturduğumuz 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_Dataseçin.) Yeni Öğe Ekle iletişim kutusundan SecurityTutorials.mdfadlı 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.

App_Data Klasörü'ne SecurityTutorials.mdf Adlı Yeni bir SQL Veritabanı Ekle

Ş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.

SecurityTutorials Veritabanı Şu Anda Boş

Ş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 aracı kullanılarak eklenebilir. Bu dosya %WINDIR%\Microsoft.Net\Framework\v2.0.50727\ klasöründe bulunur.

Not

aspnet_regsql.exe aracı hem komut satırı işlevselliği hem de grafik kullanıcı arabirimi sunar. Grafik kullanıcı arabirimi daha kullanıcı dostudur ve bu öğreticide inceleyeceğimiz konudur. Komut satırı arabirimi, derleme betikleri veya otomatik test senaryoları gibi SqlMembershipProvider şemasının eklenmesi gerektiğinde kullanışlıdır.

aracı, belirli bir SQL Server veritabanına ASP.NET uygulama hizmetleri eklemek veya kaldırmak için kullanılır. ASP.NET uygulama hizmetleri, diğer ASP.NET 2.0 çerçeveleri için SQL tabanlı sağlayıcıların şemalarıyla birlikte 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_DataKlasö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, InstanceNameSQLExpressolduğu. 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.exearacı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 SQLExpressolma olasılığı vardır. Kimlik Doğrulaması seçeneği için Windows Kimlik Doğrulaması'nı seçin.

SQL Server 2005 Express Edition Örneğine Bağlanma

Ş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 gerekiyor.

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.

SecurityTutorials.mdf Veritabanı’nı ekle

Şekil 4: SecurityTutorials.mdf Veritabanını Ekleme (Tam boyutlu görüntüyü görüntülemek için tıklayın)

SecurityTutorials.mdf Veritabanı, Veritabanları Klasörü'nde Görünür

Ş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şılmazdır. Ş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 SecurityTutorialsDatabaseyeniden 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.

Veritabanını SecurityTutorialsDatabase Olarak Yeniden Adlandırın

Şekil 6: Veritabanını SecurityTutorialsDatabaseolarak 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.

Üyelik Şemasını Eklemek için SQL Server Kurulum Sihirbazı'nın Yaptığı ASP.NET Kullanma

Şekil 7: ASP.NET SQL Server Kurulum Sihirbazı'nı kullanarak Üyelik Şeması ekleme (Görüntüyü tam boyutta görmek için tıklayın)

Sihirbazdaki ikinci adım, uygulama hizmetlerini eklemek mi yoksa kaldırmak mı istediğimizi sorar. SqlMembershipProvideriç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.

Application Services için SQL Server'ı Yapılandırma Seçeneği

Ş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 öğreticiyi takip ettiyseniz ve SecurityTutorials.mdf veritabanını App_Data'e eklediyseniz, localhost\InstanceName'ye bağladıysanız ve SecurityTutorialsDatabaseolarak yeniden adlandırdıysanız, aşağıdaki değerleri kullanın:

  • Sunucu: localhost\InstanceName
  • Windows kimlik doğrulaması
  • Veritabanı: SecurityTutorialsDatabase

Veritabanı Bilgileri girin

Ş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.

Veritabanı Ç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.exetarafı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.sqlgibi adlarla WINDIR%\Microsoft.Net\Framework\v2.0.50727\ klasöründe bulunur.

Bu noktada, SqlMembershipProvidertarafından gereken veritabanı nesnelerini oluşturduk. Ancak yine de Üyelik frameworküne SqlMembershipProvider'ı (örneğin, ActiveDirectoryMembershipProvideryerine) kullanması ve SqlMembershipProvider'nin SecurityTutorials veritabanını kullanması gerektiğini belirtmemiz 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 SqlRoleProvidertarafı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.

Kullanıcı Hesapları Birden Çok Uygulamada Bölümlenebilir

Ş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, LoweredApplicationNameve 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_Applicationsiç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 uniqueidentifiertü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_Membershipiç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ı kompromize edilmişse - ister arka kapı bulan bir bilgisayar korsanı, ister veritabanına erişimi olan memnuniyetsiz bir çalışan tarafından olsun - tüm kullanıcıların kimlik bilgileri ele geçirilebilir durumda olacaktır.
  • Karma - Parolalar, rastgele oluşturulan bir tuz değeri ve tek yönlü bir karma algoritması kullanılarak şifrelenir. 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.configiç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, PasswordFormatve PasswordSalt. PasswordFormat, değeri parolanın depolanması için kullanılan tekniği gösteren int türünde bir alandır: 0 Açık için; 1 Karma için; 2 Şifreli için. 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==
Hashed 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 uniqueidentifiertü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- SqlMembershipProviderkullanacağız. Membership sınıfındaki yöntemlerden birini çağırdığımızda, Üyelik çerçevesi çağrıyı SqlMembershipProvider'e devretmesi gerektiğini nasıl anlar?

Membership sınıfı, Üyelik çerçevesi tarafından kullanılabilen tüm kayıtlı sağlayıcı sınıflarına ait bir referansı içeren Providers özellik'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 requiresUniqueEmailbulunur. SqlMembershipProvidertarafı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ı SqlMembershipProvidertüründe AspNetSqlMembershipProvider adlı bir sağlayıcıya sahiptir. Bu varsayılan Üyelik sağlayıcısı, %WINDIR%\Microsoft.Net\Framework\v2.0.50727\CONFIG)konumunda bulunan machine.config'a kaydedilmiştir.

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.configSqlMembershipProvidertü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 tüm yapılandırma ayarlarının SqlMembershipProvider sınıfının varsayılan değerlerine her zaman karşılık gelmediğini unutmayın. Örneğin, üyelik sağlayıcısında belirtilmezse, requiresUniqueEmail ayarı varsayılan olarak true olur. Ancak, AspNetSqlMembershipProvider açıkça falsedeğ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, Hashedveya 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'e ek olarak, her bir uygulama için Web.config dosyasına benzer etiketler eklenerek diğer Üyelik sağlayıcıları 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.

SqlMembershipProviderAyarlarını Özelleştirme

Varsayılan SqlMembershipProvider (AspNetSqlMembershipProvider) connectionStringName özniteliği LocalSqlServerolarak ayarlanmıştır. AspNetSqlMembershipProvider sağlayıcısı gibi, LocalSqlServer bağlantı dizesi adı da machine.configiç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 etmek üzere çevrilir, böylece |DataDirectory|aspnetdb.mdf" veritabanı yolu ~/App_Data/aspnet.mdfolarak ç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. AspNetSqlMembershipProvidertarafı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önderisi ASP.NET 2.0 Uygulama Hizmetlerini SQL Server 2000 veya SQL Server 2005Kullanacak Şekilde Yapılandırma.
  • SqlMembershipProvider türünde yeni bir kayıtlı sağlayıcı ekleyin veconnectionStringNameayarınıSecurityTutorials.mdfveritabanı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, SecurityTutorialsSqlMembershipProvideradlı 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.

Dikkat edin, SecurityTutorialsSqlMembershipProvider'ın connectionStringName ayarı, yeni eklenen SecurityTutorialsConnectionString bağlantı dizesi adına başvurmaktadır ve applicationName ayarı SecurityTutorials değerine ayarlanmıştır. Ayrıca, requiresUniqueEmail ayarı trueolarak ayarlanmıştır. Diğer tüm yapılandırma seçenekleri AspNetSqlMembershipProvideriç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 Üyeliğini ve Diğer SağlayıcılarYapılandırırken her zaman applicationName Özelliğini Ayarlama.

Ö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ı dizisine (SecurityTutorialsConnectionString) ayarlanmış, applicationName değeri ise açıkça belirlenmiştir.

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:

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 öğretici serisi birçok yararlı eleştirmen tarafından gözden geçirildi. Bu öğreticinin baş gözden geçireni Alicja Maziarz'dı. Yaklaşan MSDN makalelerimi gözden geçirmek istiyor musunuz? Öyleyse, mitchell@4GuysFromRolla.combana mesaj atın.