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
Uyarı
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 Kimlik 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 eğitimde sadece tartışmadan uygulamaya geçeceğiz; Özellikle, form kimlik doğrulamasının uygulanmasına bakacağız. Bu öğreticide oluşturmaya başladığımız web uygulaması, basit form kimlik doğrulamasından üyelik ve rollere geçerken sonraki öğreticilerde oluşturulmaya devam edecektir.
Bu konu hakkında daha fazla bilgi için lütfen bu videoya bakın: ASP.NET'da Temel Form Kimlik Doğrulamasını Kullanma.
Giriş
Önceki öğreticide, ASP.NET tarafından sağlanan çeşitli kimlik doğrulama, yetkilendirme ve kullanıcı hesabı seçeneklerini ele aldık. Bu eğitimde sadece tartışmadan uygulamaya geçeceğiz; Özellikle, form kimlik doğrulamasının uygulanmasına bakacağız. Bu öğreticide oluşturmaya başladığımız web uygulaması, basit form kimlik doğrulamasından üyelik ve rollere geçerken sonraki öğreticilerde oluşturulmaya devam edecektir.
Bu öğretici, önceki öğreticide değindiğimiz bir konu olan form kimlik doğrulama iş akışına derinlemesine bir bakışla başlar. Bunu takiben, form kimlik doğrulaması kavramlarını tanıtmak için ASP.NET bir web sitesi oluşturacağız. Ardından, siteyi form kimlik doğrulamasını kullanacak şekilde yapılandıracağız, basit bir oturum açma sayfası oluşturacağız ve kodda bir kullanıcının kimliğinin doğrulanıp doğrulanmadığını ve eğer öyleyse oturum açtıkları kullanıcı adını nasıl belirleyeceğimizi göreceğiz.
Form kimlik doğrulama iş akışını anlamak, bir web uygulamasında etkinleştirmek ve oturum açma ve kapatma sayfalarının oluşturulması, kullanıcı hesaplarını destekleyen ve bir web sayfası aracılığıyla kullanıcıların kimliğini doğrulayan bir ASP.NET uygulaması oluşturmanın hayati adımlarıdır. Bu nedenle - ve bu öğreticiler birbiri üzerine inşa edildiğinden - geçmiş projelerde form kimlik doğrulamasını yapılandırma deneyiminiz olsa bile, bir sonrakine geçmeden önce bu öğretici üzerinde tam olarak çalışmanızı öneririm.
Form Kimlik Doğrulaması İş Akışını Anlama
ASP.NET çalışma zamanı, ASP.NET sayfası veya ASP.NET Web hizmeti gibi bir ASP.NET kaynağı için bir isteği işlediğinde, istek yaşam döngüsü boyunca bir dizi olay oluşturur. İsteğin en başında ve en sonunda ortaya çıkan olaylar, isteğin kimliği doğrulanırken ve yetkilendirilirken ortaya çıkan olaylar, işlenmeyen bir özel durum durumunda ortaya çıkan bir olay vb. vardır. Olayların tam listesini görmek için HttpApplication nesnesinin olaylarına bakın.
HTTP Modülleri , kodu istek yaşam döngüsündeki belirli bir olaya yanıt olarak yürütülen yönetilen sınıflardır. ASP.NET, perde arkasında temel görevleri yerine getiren bir dizi HTTP Modülü ile birlikte gelir. Tartışmamızla özellikle ilgili olan iki yerleşik HTTP Modülü şunlardır:
-
FormsAuthenticationModule
– Genellikle kullanıcının tanımlama bilgileri koleksiyonuna dahil edilen form kimlik doğrulama biletini inceleyerek kullanıcının kimliğini doğrular. Form kimlik doğrulama bileti yoksa, kullanıcı anonimdir. -
UrlAuthorizationModule
– mevcut kullanıcının istenen URL'ye erişme yetkisine sahip olup olmadığını belirler. Bu modül, uygulamanın yapılandırma dosyalarında belirtilen yetkilendirme kurallarına başvurarak yetkiyi belirler. ASP.NET ayrıca,FileAuthorizationModule
istenen dosya(lar)ın ACL'lerine danışarak otoriteyi belirleyen şeyi de içerir.
Yürütmeden FormsAuthenticationModule
önce UrlAuthorizationModule
(ve FileAuthorizationModule
) kullanıcının kimliğini doğrulama girişimleri. İstekte bulunan kullanıcının istenen kaynağa erişme yetkisi yoksa, yetkilendirme modülü isteği sonlandırır ve HTTP 401 Yetkisiz durumu döndürür. Windows kimlik doğrulama senaryolarında, HTTP 401 durumu tarayıcıya döndürülür. Bu durum kodu, tarayıcının kalıcı bir iletişim kutusu aracılığıyla kullanıcıdan kimlik bilgilerini istemesine neden olur. Bununla birlikte, form kimlik doğrulamasıyla, HTTP 401 Yetkisiz durumu hiçbir zaman tarayıcıya gönderilmez, çünkü FormsAuthenticationModule bu durumu algılar ve kullanıcıyı bunun yerine oturum açma sayfasına yönlendirmek için değiştirir (HTTP 302 Yeniden Yönlendirme durumu aracılığıyla).
Oturum açma sayfasının sorumluluğu, kullanıcının kimlik bilgilerinin geçerli olup olmadığını belirlemek ve geçerliyse, bir form kimlik doğrulama bileti oluşturmak ve kullanıcıyı ziyaret etmeye çalıştıkları sayfaya geri yönlendirmektir. Kimlik doğrulama bileti, FormsAuthenticationModule
kullanıcıyı tanımlamak için kullanılan web sitesindeki sayfalara yapılan sonraki isteklere dahil edilir.
Şekil 1: Form Kimlik Doğrulaması İş Akışı
Sayfa Ziyaretlerinde Kimlik Doğrulama Biletini Hatırlama
Oturum açtıktan sonra, kullanıcının siteye göz atarken oturum açmış kalması için form kimlik doğrulama biletinin her istekte web sunucusuna geri gönderilmesi gerekir. Bu genellikle kimlik doğrulama biletini kullanıcının tanımlama bilgileri koleksiyonuna yerleştirerek gerçekleştirilir. Çerezler , kullanıcının bilgisayarında bulunan ve çerezi oluşturan web sitesine her istekte HTTP başlıklarında iletilen küçük metin dosyalarıdır. Bu nedenle, form kimlik doğrulama bileti oluşturulduktan ve tarayıcının tanımlama bilgilerinde saklandıktan sonra, bu siteye yapılan sonraki her ziyaret, istekle birlikte kimlik doğrulama biletini gönderir ve böylece kullanıcıyı tanımlar.
Çerezlerin bir yönü, tarayıcının çerezi attığı tarih ve saat olan sona erme tarihleridir. Form kimlik doğrulama tanımlama bilgisinin süresi dolduğunda, kullanıcının kimliği artık doğrulanamaz ve bu nedenle anonim hale gelir. Bir kullanıcı halka açık bir terminalden ziyaret ettiğinde, tarayıcılarını kapattıklarında kimlik doğrulama biletlerinin süresinin dolmasını isteme olasılıkları vardır. Bununla birlikte, evden ziyaret ederken, aynı kullanıcı, siteyi her ziyaret ettiğinde yeniden oturum açmak zorunda kalmamak için tarayıcı yeniden başlatmalarında kimlik doğrulama biletinin hatırlanmasını isteyebilir. Bu karar genellikle kullanıcı tarafından giriş sayfasında "Beni hatırla" onay kutusu şeklinde verilir. 3. Adımda, oturum açma sayfasında "Beni hatırla" onay kutusunun nasıl uygulanacağını inceleyeceğiz. Aşağıdaki öğreticide, kimlik doğrulama bileti zaman aşımı ayarları ayrıntılı olarak ele alınmaktadır.
Uyarı
Web sitesinde oturum açmak için kullanılan kullanıcı aracısının çerezleri desteklememesi mümkündür. Böyle bir durumda, ASP.NET tanımlama bilgisi olmayan form kimlik doğrulama biletlerini kullanabilir. Bu modda, kimlik doğrulama bileti URL'ye kodlanır. Bir sonraki öğreticide tanımlama bilgisi olmayan kimlik doğrulama biletlerinin ne zaman kullanıldığına ve bunların nasıl oluşturulup yönetildiğine bakacağız.
Form Kimlik Doğrulamasının Kapsamı
ASP.NET FormsAuthenticationModule
çalışma zamanının bir parçası olan yönetilen koddur. Microsoft'un Internet Information Services (IIS) web sunucusunun 7. sürümünden önce, IIS'nin HTTP işlem hattı ile ASP.NET çalışma zamanının işlem hattı arasında belirgin bir engel vardı. Kısacası, IIS 6 ve önceki sürümlerde, FormsAuthenticationModule
yalnızca bir istek IIS'den ASP.NET çalışma zamanına temsilci olarak atandığında yürütülür. Varsayılan olarak, IIS statik içeriği (HTML sayfaları, CSS ve resim dosyaları gibi) kendisi işler ve yalnızca .aspx, .asmx veya .ashx uzantılı bir sayfa istendiğinde istekleri ASP.NET çalışma zamanına iletir.
Ancak IIS 7, tümleşik IIS ve ASP.NET işlem hatlarına izin verir. Birkaç yapılandırma ayarıyla, IIS 7'yi tüm istekler için FormsAuthenticationModule çağıracak şekilde ayarlayabilirsiniz. Ayrıca, IIS 7 ile her türdeki dosya için URL yetkilendirme kuralları tanımlayabilirsiniz. Daha fazla bilgi için bkz: IIS6 ve IIS7 Güvenliği Arasındaki Değişiklikler, Web Platformunuzun Güvenliği ve IIS7 URL Yetkilendirmesini Anlama.
Uzun lafın kısası, IIS 7'den önceki sürümlerde, ASP.NET çalışma zamanı tarafından işlenen kaynakları korumak için yalnızca form kimlik doğrulamasını kullanabilirsiniz. Benzer şekilde, URL yetkilendirme kuralları yalnızca ASP.NET çalışma zamanı tarafından işlenen kaynaklara uygulanır. Ancak IIS 7 ile FormsAuthenticationModule ve UrlAuthorizationModule öğelerini IIS'nin HTTP işlem hattına entegre etmek ve böylece bu işlevselliği tüm isteklere genişletmek mümkündür.
Adım 1: Bu Eğitim Serisi için ASP.NET bir Web Sitesi Oluşturma
Mümkün olan en geniş kitleye ulaşmak için, bu seri boyunca oluşturacağımız ASP.NET web sitesi, Microsoft'un Visual Studio 2008'in ücretsiz sürümü olan Visual Web Developer 2008 ile oluşturulacaktır. Kullanıcı deposunu SqlMembershipProvider
bir Microsoft SQL Server 2005 Express Edition veritabanında uygulayacağız. Visual Studio 2005 veya Visual Studio 2008 veya SQL Server'ın farklı bir sürümünü kullanıyorsanız endişelenmeyin - adımlar hemen hemen aynı olacaktır ve önemsiz olmayan farklılıklar belirtilecektir.
Uyarı
Her öğreticide kullanılan demo web uygulaması indirilebilir hale getirilebilir. Bu indirilebilir uygulama, .NET Framework sürüm 3.5 için hedeflenen Visual Web Developer 2008 ile oluşturulmuştur. Uygulama .NET 3.5 için hedeflendiğinden, Web.config dosyası 3.5'e özgü ek yapılandırma öğeleri içerir. Uzun lafın kısası, bilgisayarınıza henüz .NET 3.5 yüklemediyseniz, indirilebilir web uygulaması, önce 3.5'e özgü işaretlemeyi Web.config'dan kaldırmadan çalışmayacaktır.
Form kimlik doğrulamasını yapılandırabilmemiz için önce bir ASP.NET web sitesine ihtiyacımız var. Yeni bir dosya sistemi tabanlı ASP.NET web sitesi oluşturarak başlayın. Bunu gerçekleştirmek için, Visual Web Developer'ı başlatın ve ardından Dosya menüsüne gidin ve Yeni Web Sitesi'ni seçerek Yeni Web Sitesi iletişim kutusunu görüntüleyin. ASP.NET Web Sitesi şablonunu seçin, Konum açılan listesini Dosya Sistemi olarak ayarlayın, web sitesini yerleştirmek için bir klasör seçin ve dili C# olarak ayarlayın. Bu, bir Default.aspx ASP.NET sayfası, bir App_Data klasörü ve bir Web.config dosyası içeren yeni bir web sitesi oluşturur.
Uyarı
Visual Studio iki proje yönetimi modunu destekler: Web Sitesi Projeleri ve Web Uygulaması Projeleri. Web Sitesi Projeleri bir proje dosyasından yoksundur, oysa Web Uygulaması Projeleri Visual Studio .NET 2002/2003'teki proje mimarisini taklit eder – bir proje dosyası içerir ve projenin kaynak kodunu /bin klasörüne yerleştirilen tek bir derlemeye derler. Visual Studio 2005 başlangıçta yalnızca Web Sitesi Projelerini destekledi, ancak Web Uygulaması Projesi modeli Service Pack 1 ile yeniden tanıtıldı; Visual Studio 2008 her iki proje modelini de sunar. Ancak Visual Web Developer 2005 ve 2008 sürümleri yalnızca Web Sitesi Projelerini destekler. Web Sitesi Projesi modelini kullanacağım. Express olmayan bir sürüm kullanıyorsanız ve bunun yerine Web Uygulaması Projesi modelini kullanmak istiyorsanız, bunu yapmaktan çekinmeyin, ancak ekranınızda gördükleriniz ile atmanız gereken adımlar ile gösterilen ekran görüntüleri ve bu öğreticilerde sağlanan yönergeler arasında bazı tutarsızlıklar olabileceğini unutmayın.
Şekil 2: Web Sitesi System-Based Yeni Dosya Oluşturma (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Ana Sayfa Ekleme
Ardından, Site.master adlı kök dizindeki siteye yeni bir Ana Sayfa ekleyin. Ana sayfalar , sayfa geliştiricisinin ASP.NET sayfalara uygulanabilecek site genelinde bir şablon tanımlamasına olanak tanır. Ana sayfaların başlıca yararı, sitenin genel görünümünün tek bir konumda tanımlanabilmesi ve böylece site düzenini güncelleştirmeyi veya ince ayar yapmayı kolaylaştırmasıdır.
Şekil 3: Web Sitesine Site.master Adında Bir Ana Sayfa Ekleme (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Site genelindeki sayfa düzenini burada, ana sayfada tanımlayın. Tasarım görünümünü kullanabilir ve ihtiyacınız olan Düzen veya Web denetimlerini ekleyebilir ya da işaretlemeyi Kaynak görünümünde el ile ekleyebilirsiniz. Ana sayfamın düzenini , ASP.NET 2.0 öğretici serisinde Verilerle Çalışma aracında kullanılan düzeni taklit edecek şekilde yapılandırdım (bkz. Şekil 4). Ana sayfa, dosya Style.css (bu öğreticinin ilişkili indirmesinde yer alan) tanımlanan CSS ayarlarıyla konumlandırma ve stiller için basamaklı stil sayfaları kullanır. Aşağıda gösterilen işaretlemeden anlayamasanız da, CSS kuralları, gezinme <div'inin> içeriği kesinlikle solda görünecek ve 200 piksellik sabit bir genişliğe sahip olacak şekilde tanımlanmıştır.
<%@ Master Language="C#" AutoEventWireup="true" CodeFile="Site.master.cs" Inherits="Site" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
<title>Forms Authentication, Authorization, and User Accounts</title>
<link href="Styles.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="wrapper">
<form id="form1" runat="server">
<div id="header">
<span class="title">User Account Tutorials</span>
</div>
<div id="content">
<asp:contentplaceholder id="MainContent" runat="server">
<!-- Page-specific content will go here... -->
</asp:contentplaceholder>
</div>
<div id="navigation">
TODO: Menu will go here...
</div>
</form>
</div>
</body>
</html>
Ana sayfa, hem statik sayfa düzenini hem de ana sayfayı kullanan ASP.NET sayfalar tarafından düzenlenebilen bölgeleri tanımlar. Bu içerik düzenlenebilir bölgeler, içerik ContentPlaceHolder
div'inde <>görülebilen kontrol ile belirtilir. Ana sayfamızda tek ContentPlaceHolder
bir (MainContent) vardır, ancak ana sayfada birden çok ContentPlaceHolder olabilir.
Yukarıda girilen işaretleme ile Tasarım görünümüne geçildiğinde ana sayfanın düzeni gösterilir. Bu ana sayfayı kullanan tüm ASP.NET sayfalar, bölge için işaretlemeyi belirtme özelliğiyle birlikte bu tekdüzen düzene MainContent
sahip olacaktır.
Şekil 4: Tasarım Görünümünden Görüntülendiğinde Ana Sayfa (Tam boyutlu görüntüyü görüntülemek için tıklayın)
İçerik Sayfaları Oluşturma
Bu noktada web sitemizde bir Default.aspx sayfamız var, ancak yeni oluşturduğumuz ana sayfayı kullanmıyor. Bir ana sayfayı kullanmak için bir web sayfasının bildirim temelli işaretlemesini değiştirmek mümkün olsa da, sayfa henüz herhangi bir içerik içermiyorsa, sayfayı silmek ve kullanılacak ana sayfayı belirterek projeye yeniden eklemek daha kolaydır. Bu nedenle, projeden Default.aspx silerek başlayın.
Ardından, Çözüm Gezgini'nde proje adına sağ tıklayın ve Default.aspx adlı yeni bir Web Formu eklemeyi seçin. Bu kez, "Ana sayfayı seç" onay kutusunu işaretleyin ve listeden Site.master ana sayfasını seçin.
Şekil 5: Yeni Bir Default.aspx Sayfası Ekleme Ana Sayfa Seçmeyi Seçme (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Şekil 6: Site.master Ana Sayfasını kullanma
Uyarı
Web Uygulaması Proje Modeli'ni kullanıyorsanız, Yeni Öğe Ekle iletişim kutusunda "Ana sayfa seç" onay kutusu bulunmaz. Bunun yerine, "Web İçeriği Formu" türünde bir öğe eklemeniz gerekir. "Web İçeriği Formu" seçeneğini seçtikten ve Ekle'ye tıkladıktan sonra, Visual Studio, Şekil 6'da gösterilen Ana Seç iletişim kutusunun aynısını görüntüler.
Yeni Default.aspx sayfasının bildirim temelli işaretlemesi yalnızca ana sayfa dosyasının yolunu belirten bir @Page yönerge ve ana sayfanın MainContent ContentPlaceHolder'ı için bir İçerik denetimi içerir.
<%@ Page Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" Title="Untitled Page" %>
<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" Runat="Server">
</asp:Content>
Şimdilik Default.aspx boş bırakın. İçerik eklemek için bu eğitimde daha sonra buna geri döneceğiz.
Uyarı
Ana sayfamız, bir menü veya başka bir gezinme arayüzü için bir bölüm içerir. Gelecekteki bir eğitimde böyle bir arayüz oluşturacağız.
Adım 2: Form Kimlik Doğrulamasını Etkinleştirme
ASP.NET web sitesi oluşturulduktan sonra, bir sonraki görevimiz form kimlik doğrulamasını etkinleştirmektir. Uygulamanın kimlik doğrulama yapılandırması, içindeki öğe aracılığıyla <authentication>
Web.configbelirtilir. Öğe<authentication>
, uygulama tarafından kullanılan kimlik doğrulama modelini belirten mode adlı tek bir öznitelik içerir. Bu öznitelik aşağıdaki dört değerden birine sahip olabilir:
- Windows – önceki öğreticide açıklandığı gibi, bir uygulama Windows kimlik doğrulamasını kullandığında, ziyaretçinin kimliğini doğrulamak web sunucusunun sorumluluğundadır ve bu genellikle Temel, Özet veya Tümleşik Windows kimlik doğrulaması aracılığıyla yapılır.
- Formlar– kullanıcıların kimliği bir web sayfasındaki bir form aracılığıyla doğrulanır.
- Pasaport– kullanıcıların kimlikleri Microsoft'un Passport Ağı kullanılarak doğrulanır.
- Yok– kimlik doğrulama modeli kullanılmaz; Tüm ziyaretçiler anonimdir.
Varsayılan olarak, ASP.NET uygulamalar Windows kimlik doğrulamasını kullanır. Kimlik doğrulama türünü form kimlik doğrulaması olarak değiştirmek için, öğenin mode özniteliğini <authentication>
Forms olarak değiştirmemiz gerekir.
Projeniz henüz bir Web.config dosyası içermiyorsa, Çözüm Gezgini'nde proje adına sağ tıklayarak, Yeni Öğe Ekle'yi seçerek ve ardından bir Web Yapılandırma dosyası ekleyerek şimdi bir tane ekleyin.
Şekil 7: Projeniz Henüz Web.configİçermiyorsa, Şimdi Ekleyin (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Ardından, öğeyi bulun ve form kimlik doğrulamasını <authentication>
kullanacak şekilde güncelleştirin. Bu değişiklikten sonra, Web.config dosyanızın biçimlendirmesi aşağıdakine benzer görünmelidir:
<configuration>
<system.web>
... Unrelated configuration settings and comments removed for brevity ...
<!--
The <authentication> section enables configuration
of the security authentication mode used by
ASP.NET to identify an incoming user.
-->
<authentication mode="Forms" />
</system.web>
</configuration>
Uyarı
Web.config bir XML dosyası olduğundan, büyük/küçük harf kullanımı önemlidir. mode özniteliğini büyük "F" ile Formlar olarak ayarladığınızdan emin olun. "Formlar" gibi farklı bir büyük/küçük harf kullanırsanız, siteyi bir tarayıcı aracılığıyla ziyaret ettiğinizde bir yapılandırma hatası alırsınız.
Öğe <authentication>
isteğe bağlı olarak, form kimlik doğrulamasına özgü ayarları içeren bir <forms>
alt öğe içerebilir. Şimdilik, yalnızca varsayılan form kimlik doğrulama ayarlarını kullanalım. Bir sonraki eğitimde alt öğeyi daha ayrıntılı olarak inceleyeceğiz <forms>
.
3. Adım: Giriş Sayfasını Oluşturma
Form kimlik doğrulamasını desteklemek için web sitemizin bir giriş sayfasına ihtiyacı vardır. "Form Kimlik Doğrulama İş Akışını Anlama" bölümünde anlatıldığı gibi, FormsAuthenticationModule
kullanıcı, görüntüleme yetkisi olmayan bir sayfaya erişmeye çalışırsa otomatik olarak oturum açma sayfasına yönlendirilir. Ayrıca, anonim kullanıcılara oturum açma sayfasına bir bağlantı görüntüleyen ASP.NET Web denetimleri de vardır. Bu, "Giriş sayfasının URL'si nedir?" sorusunu akla getiriyor.
Varsayılan olarak, form kimlik doğrulama sistemi oturum açma sayfasının Login.aspx adlandırılmasını ve web uygulamasının kök dizinine yerleştirilmesini bekler. Farklı bir giriş sayfası URL'si kullanmak istiyorsanız, bunu Web.configiçinde belirterek yapabilirsiniz. Bir sonraki eğitimde bunun nasıl yapılacağını göreceğiz.
Oturum açma sayfasının üç sorumluluğu vardır:
- Ziyaretçinin kimlik bilgilerini girmesine izin veren bir arayüz sağlayın.
- Gönderilen kimlik bilgilerinin geçerli olup olmadığını belirleyin.
- Form kimlik doğrulama biletini oluşturarak kullanıcının "oturum açmasını".
Oturum açma sayfasının kullanıcı arayüzünü oluşturma
İlk görevle başlayalım. Sitenin Login.aspx adlı kök dizinine yeni bir ASP.NET sayfası ekleyin ve bunu Site.master ana sayfasıyla ilişkilendirin.
Şekil 8: Login.aspx Adında Yeni Bir ASP.NET Sayfası Ekleme (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Tipik oturum açma sayfası arayüzü, biri kullanıcının adı, biri şifresi için olmak üzere iki metin kutusundan ve formu göndermek için bir düğmeden oluşur. Web siteleri çoğu zaman, işaretlenirse, ortaya çıkan kimlik doğrulama biletini tarayıcı yeniden başlatmalarında sürdüren bir "Beni hatırla" onay kutusu içerir.
Login.aspx için iki TextBox ekleyin ve özelliklerini ID
sırasıyla UserName ve Password olarak ayarlayın. Ayrıca Parola'nın TextMode
özelliğini Parola olarak ayarlayın. Ardından, özelliğini RememberMe ve ID
özelliğini "Beni Hatırla" olarak ayarlayarak Text
bir CheckBox denetimi ekleyin. Bunu takiben, özelliği "Login" olarak ayarlanmış LoginButton Text
adlı bir Düğme ekleyin. Son olarak, bir Etiket Web denetimi ekleyin ve özelliğini InvalidCredentialsMessage, ID
özelliğini ise "Kullanıcı adınız veya parolanız geçersiz" olarak ayarlayınText
. Lütfen tekrar deneyin.", özelliği ForeColor
Red'e ve Visible
özelliği False'a dönüştürülür.
Bu noktada, ekranınız Şekil 9'daki ekran görüntüsüne benzer şekilde görünmelidir ve sayfanızın bildirim temelli sözdizimi aşağıdaki gibi olmalıdır:
<%@ Page Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="Login.aspx.cs" Inherits="Login" %>
<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" Runat="Server">
<h1>
Login</h1>
<p>
Username:
<asp:TextBox ID="UserName" runat="server"></asp:TextBox></p>
<p>
Password:
<asp:TextBox ID="Password" runat="server" TextMode="Password"></asp:TextBox></p>
<p>
<asp:CheckBox ID="RememberMe" runat="server" Text="Remember Me" /> </p>
<p>
<asp:Button ID="LoginButton" runat="server" Text="Login" OnClick="LoginButton_Click" /> </p>
<p>
<asp:Label ID="InvalidCredentialsMessage" runat="server" ForeColor="Red" Text="Your username or password is invalid. Please try again."
Visible="False"></asp:Label> </p>
</asp:Content>
Şekil 9: Oturum Açma Sayfası İki TextBox, bir CheckBox, bir Düğme ve bir Etiket içeriyor (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Son olarak, LoginButton'ın Click olayı için bir olay işleyicisi oluşturun. Tasarımcıdan, bu olay işleyicisini oluşturmak için Düğme denetimine çift tıklamanız yeterlidir.
Sağlanan Kimlik Bilgilerinin Geçerli Olup Olmadığını Belirleme
Şimdi, sağlanan kimlik bilgilerinin geçerli olup olmadığını belirlemek için Button'ın Click olay işleyicisinde görev 2'yi uygulamamız gerekiyor. Bunu yapmak için, sağlanan kimlik bilgilerinin bilinen kimlik bilgileriyle eşleşip eşleşmediğini belirleyebilmemiz için tüm kullanıcıların kimlik bilgilerini tutan bir kullanıcı deposu olması gerekir.
ASP.NET 2.0'dan önce, geliştiriciler hem kendi kullanıcı depolarını uygulamaktan hem de sağlanan kimlik bilgilerini depoya karşı doğrulamak için kodu yazmaktan sorumluydu. Çoğu geliştirici, kullanıcı deposunu bir veritabanında uygular ve UserName, Password, Email, LastLoginDate vb. gibi sütunlara sahip Kullanıcılar adlı bir tablo oluşturur. Bu tabloda, her kullanıcı hesabı için bir kayıt bulunur. Bir kullanıcının sağlanan kimlik bilgilerini doğrulamak, eşleşen bir kullanıcı adı için veritabanını sorgulamayı ve ardından veritabanındaki parolanın sağlanan parolaya karşılık geldiğinden emin olmayı içerir.
ASP.NET 2.0 ile geliştiriciler, kullanıcı mağazasını yönetmek için Üyelik sağlayıcılarından birini kullanmalıdır. Bu öğretici serisinde, kullanıcı deposu için bir SQL Server veritabanı kullanan SqlMembershipProvider'ı kullanacağız. SqlMembershipProvider'ı kullanırken, sağlayıcı tarafından beklenen tabloları, görünümleri ve saklı yordamları içeren belirli bir veritabanı şeması uygulamamız gerekir. SQL Server'da Üyelik Şeması Oluşturma öğreticisinde bu şemanın nasıl uygulanacağını inceleyeceğiz. Üyelik sağlayıcısı yerindeyken, kullanıcının kimlik bilgilerini doğrulamak, kullanıcı adı ve parola birleşiminin geçerliliğini belirten bir Boole değeri döndüren Üyelik sınıfınınValidateUser(kullanıcı adı, parola) yöntemini çağırmak kadar basittir. SqlMembershipProvider'ın kullanıcı deposunu henüz uygulamadığımız için şu anda Membership sınıfının ValidateUser yöntemini kullanamıyoruz.
Kendi özel Users veritabanı tablomuzu oluşturmak için zaman ayırmak yerine (SqlMembershipProvider'ı uyguladıktan sonra eski olacaktı), bunun yerine oturum açma sayfasının kendisinde geçerli kimlik bilgilerini sabit kodlayalım. LoginButton'ın Click olay işleyicisine aşağıdaki kodu ekleyin:
protected void LoginButton_Click(object sender, EventArgs e)
{
// Three valid username/password pairs: Scott/password, Jisun/password, and Sam/password.
string[] users = { "Scott", "Jisun", "Sam" };
string[] passwords = { "password", "password", "password" };
for (int i = 0; i < users.Length; i++)
{
bool validUsername = (string.Compare(UserName.Text, users[i], true) == 0);
bool validPassword = (string.Compare(Password.Text, passwords[i], false) == 0);
if (validUsername && validPassword)
{
// TODO: Log in the user...
// TODO: Redirect them to the appropriate page
}
}
// If we reach here, the user's credentials were invalid
InvalidCredentialsMessage.Visible = true;
}
Gördüğünüz gibi, üç geçerli kullanıcı hesabı var – Scott, Jisun ve Sam – ve üçünün de aynı şifresi ("şifre") var. Kod, geçerli bir kullanıcı adı ve parola eşleşmesi aramak için kullanıcılar ve parola dizileri arasında döngü oluşturur. Hem kullanıcı adı hem de şifre geçerliyse, kullanıcının oturumunu açmamız ve ardından onları uygun sayfaya yönlendirmemiz gerekir. Kimlik bilgileri geçersizse, InvalidCredentialsMessage Etiketini görüntüleriz.
Bir kullanıcı geçerli kimlik bilgileri girdiğinde, daha sonra "uygun sayfaya" yönlendirildiklerini belirttim. Yine de uygun sayfa nedir? Bir kullanıcı görüntüleme yetkisi olmayan bir sayfayı ziyaret ettiğinde, FormsAuthenticationModule tarafından otomatik olarak oturum açma sayfasına yönlendirildiğini hatırlayın. Bunu yaparken, istenen URL'yi ReturnUrl parametresi aracılığıyla sorgu dizesine ekler. Diğer bir deyişle, bir kullanıcı ProtectedPage.aspx ziyaret etmeye çalışırsa ve bunu yapma yetkisi yoksa, FormsAuthenticationModule onları şuraya yönlendirir:
Login.aspx? ReturnUrl=ProtectedPage.aspx
Başarılı bir şekilde oturum açtıktan sonra, kullanıcı tekrar ProtectedPage.aspx'ye yönlendirilmelidir. Alternatif olarak, kullanıcılar kendi istekleriyle giriş sayfasını ziyaret edebilirler. Bu durumda, kullanıcı oturum açtıktan sonra kök klasörün Default.aspx sayfasına gönderilmelidir.
Kullanıcının Oturum Açması
Sağlanan kimlik bilgilerinin geçerli olduğunu varsayarsak, bir form kimlik doğrulama bileti oluşturmamız ve böylece kullanıcının sitede oturum açması gerekir. System.Web.Security ad alanındakiFormsAuthentication sınıfı, form kimlik doğrulama sistemi aracılığıyla kullanıcıların oturum açması ve oturumunu kapatması için çeşitli yöntemler sağlar. FormsAuthentication sınıfında birkaç yöntem olsa da, bu noktada ilgilendiğimiz üç yöntem şunlardır:
- GetAuthCookie(kullanıcı adı, persistCookie) – sağlanan ad kullanıcı adı için bir form kimlik doğrulama bileti oluşturur. Ardından, bu yöntem kimlik doğrulama biletinin içeriğini tutan bir HttpCookie nesnesi oluşturur ve döndürür. persistCookie true ise, kalıcı bir çerez oluşturulur.
- SetAuthCookie(kullanıcı adı, persistCookie) – form kimlik doğrulama çerezini oluşturmak için GetAuthCookie(kullanıcı adı, persistCookie) yöntemini çağırır. Bu yöntem daha sonra GetAuthCookie tarafından döndürülen tanımlama bilgisini Tanımlama Bilgileri koleksiyonuna ekler (tanımlama bilgisi tabanlı form kimlik doğrulamasının kullanıldığı varsayılarak; aksi takdirde, bu yöntem tanımlama bilgisi olmayan bilet mantığını işleyen bir iç sınıfı çağırır).
- RedirectFromLoginPage(kullanıcı adı, persistCookie) – bu yöntem SetAuthCookie(kullanıcı adı, persistCookie) öğesini çağırır ve ardından kullanıcıyı uygun sayfaya yönlendirir.
GetAuthCookie, tanımlama bilgisini Tanımlama Bilgileri koleksiyonuna yazmadan önce kimlik doğrulama biletini değiştirmeniz gerektiğinde kullanışlıdır. SetAuthCookie, form kimlik doğrulama biletini oluşturmak ve bunu Tanımlama Bilgileri koleksiyonuna eklemek istiyor ancak kullanıcıyı uygun sayfaya yönlendirmek istemiyorsanız kullanışlıdır. Belki de onları giriş sayfasında tutmak veya alternatif bir sayfaya göndermek istersiniz.
Kullanıcının oturum açmasını ve uygun sayfaya yönlendirmesini istediğimiz için RedirectFromLoginPage kullanalım. LoginButton'ın Click olay işleyicisini güncelleştirin ve açıklama satırı eklenen iki TODO satırını aşağıdaki kod satırıyla değiştirin:
FormsAuthentication.RedirectFromLoginPage(UserName.Text, RememberMe.Checked);
Form kimlik doğrulama biletini oluştururken, form kimlik doğrulama bileti kullanıcı adı parametresi için UserName TextBox'ın Text özelliğini ve persistCookie parametresi için RememberMe CheckBox'ın işaretli durumunu kullanırız.
Oturum açma sayfasını test etmek için bir tarayıcıda ziyaret edin. "Hayır" kullanıcı adı ve "yanlış" şifresi gibi geçersiz kimlik bilgileri girerek başlayın. Oturum Aç düğmesine tıkladıktan sonra bir geri gönderme gerçekleşir ve InvalidCredentialsMessage Etiketi görüntülenir.
Şekil 10: Geçersiz Kimlik Bilgileri Girilirken InvalidCredentialsMessage Etiketi Görüntüleniyor (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Ardından, geçerli kimlik bilgilerini girin ve Giriş düğmesine tıklayın. Bu kez, geri gönderme gerçekleştiğinde bir form kimlik doğrulama bileti oluşturulur ve otomatik olarak Default.aspx'ye geri yönlendirilirsiniz. Bu noktada, web sitesine giriş yaptınız, ancak şu anda giriş yaptığınızı gösteren görsel bir ipucu yok. 4. Adımda, bir kullanıcının oturum açıp açmadığını programlı olarak nasıl belirleyeceğimizi ve sayfayı ziyaret eden kullanıcıyı nasıl tanımlayacağımızı göreceğiz.
Adım 5, bir kullanıcının web sitesinden çıkış yapma tekniklerini inceler.
Giriş Sayfasının Güvenliğini Sağlama
Kullanıcı kimlik bilgilerini girdiğinde ve oturum açma sayfası formunu gönderdiğinde, parolası da dahil olmak üzere kimlik bilgileri İnternet üzerinden web sunucusuna düz metin olarak iletilir. Bu, ağ trafiğini koklayan herhangi bir bilgisayar korsanının kullanıcı adını ve şifreyi görebileceği anlamına gelir. Bunu önlemek için, Güvenli Yuva Katmanları (SSL) kullanarak ağ trafiğini şifrelemek önemlidir. Bu, kimlik bilgilerinin (ve tüm sayfanın HTML işaretlemesinin) tarayıcıdan çıktıkları andan web sunucusu tarafından alınana kadar şifrelenmesini sağlayacaktır.
Web siteniz hassas bilgiler içermediği sürece, yalnızca oturum açma sayfasında ve kullanıcı şifresinin aksi takdirde düz metin olarak banka havalesi üzerinden gönderileceği diğer sayfalarda SSL kullanmanız gerekecektir. Form kimlik doğrulama biletinin güvenliğini sağlama konusunda endişelenmenize gerek yoktur, çünkü varsayılan olarak hem şifrelenir hem de dijital olarak imzalanır (kurcalamayı önlemek için). Form kimlik doğrulama bileti güvenliği hakkında daha kapsamlı bir tartışma aşağıdaki öğreticide sunulmuştur.
Uyarı
Birçok finansal ve tıbbi web sitesi, kimliği doğrulanmış kullanıcıların erişebildiği tüm sayfalarda SSL kullanacak şekilde yapılandırılmıştır. Böyle bir web sitesi oluşturuyorsanız, form kimlik doğrulama sistemini, form kimlik doğrulama bileti yalnızca güvenli bir bağlantı üzerinden iletilecek şekilde yapılandırabilirsiniz.
4. Adım: Kimliği Doğrulanmış Ziyaretçileri Tespit Etme ve Kimliklerini Belirleme
Bu noktada, form kimlik doğrulamasını etkinleştirdik ve temel bir oturum açma sayfası oluşturduk, ancak bir kullanıcının kimliğinin doğrulanıp doğrulanmadığını veya anonim olup olmadığını nasıl belirleyebileceğimizi henüz incelemedik. Bazı senaryolarda, kimliği doğrulanmış veya anonim bir kullanıcının sayfayı ziyaret edip etmediğine bağlı olarak farklı veriler veya bilgiler görüntülemek isteyebiliriz. Ayrıca, çoğu zaman kimliği doğrulanmış kullanıcının kimliğini bilmemiz gerekir.
Bu teknikleri göstermek için mevcut Default.aspx sayfasını genişletelim. Default.aspx olarak, biri AuthenticatedMessagePanel ve diğeri AnonymousMessagePanel adlı iki Panel denetimi ekleyin. İlk Panel'e WelcomeBackMessage adlı bir Etiket denetimi ekleyin. İkinci Panel'de bir HyperLink denetimi ekleyin, Text özelliğini "Log In" ve NavigateUrl özelliğini "~/Login.aspx" olarak ayarlayın. Bu noktada, Default.aspx için bildirim temelli işaretleme aşağıdakine benzer görünmelidir:
<%@ Page Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" Title="Untitled Page" %>
<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" Runat="Server">
<asp:Panel runat="server" ID="AuthenticatedMessagePanel">
<asp:Label runat="server" ID="WelcomeBackMessage"></asp:Label>
</asp:Panel>
<asp:Panel runat="Server" ID="AnonymousMessagePanel">
<asp:HyperLink runat="server" ID="lnkLogin" Text="Log In" NavigateUrl="~/Login.aspx"></asp:HyperLink>
</asp:Panel>
</asp:Content>
Muhtemelen şimdiye kadar tahmin ettiğiniz gibi, buradaki fikir, kimliği doğrulanmış ziyaretçilere yalnızca AuthenticatedMessagePanel'i ve anonim ziyaretçilere yalnızca AnonymousMessagePanel'i görüntülemektir. Bunu başarmak için, kullanıcının oturum açıp açmadığına bağlı olarak bu Panellerin Görünür özelliklerini ayarlamamız gerekir.
Request.IsAuthenticated özelliği, isteğin kimliğinin doğrulanıp doğrulanmadığını belirten bir Boole değeri döndürür. Page_Load olay işleyici koduna aşağıdaki kodu girin:
protected void Page_Load(object sender, EventArgs e)
{
if (Request.IsAuthenticated)
{
WelcomeBackMessage.Text = "Welcome back!";
AuthenticatedMessagePanel.Visible = true;
AnonymousMessagePanel.Visible = false;
}
else
{
AuthenticatedMessagePanel.Visible = false;
AnonymousMessagePanel.Visible = true;
}
}
Bu kod yerindeyken, bir tarayıcı aracılığıyla Default.aspx ziyaret edin. Henüz giriş yapmadığınızı varsayarsak, giriş sayfasına bir bağlantı göreceksiniz (bkz. Şekil 11). Bu bağlantıya tıklayın ve siteye giriş yapın. 3. Adımda gördüğümüz gibi, kimlik bilgilerinizi girdikten sonra Default.aspx geri döneceksiniz, ancak bu sefer sayfada "Tekrar hoş geldiniz!" mesajı gösteriliyor (bkz. Şekil 12).
Şekil 11: Anonim Olarak Ziyaret Ederken, Bir Oturum Açma Bağlantısı Görüntüleniyor
Şekil 12: Kimliği Doğrulanmış Kullanıcılara "Tekrar Hoş Geldiniz!" Mesajı Gösteriliyor. İleti
Şu anda oturum açmış olan kullanıcının kimliğini HttpContext nesnesininUser özelliği aracılığıyla belirleyebiliriz. HttpContext nesnesi geçerli istekle ilgili bilgileri temsil eder ve diğerlerinin yanı sıra Response, Request ve Session gibi yaygın ASP.NET nesnelerinin evidir. User özelliği, geçerli HTTP isteğinin güvenlik bağlamını temsil eder ve IPrincipal arabirimini uygular.
User özelliği FormsAuthenticationModule tarafından ayarlanır. Özellikle, FormsAuthenticationModule gelen istekte bir form kimlik doğrulama bileti bulduğunda, yeni bir GenericPrincipal nesnesi oluşturur ve bunu User özelliğine atar.
Asıl nesneler (GenericPrincipal gibi) kullanıcının kimliği ve ait oldukları roller hakkında bilgi sağlar. IPrincipal arayüzü iki üye tanımlar:
- IsInRole(roleName) – sorumlunun belirtilen role ait olup olmadığını belirten bir Boole değeri döndüren bir yöntem.
- Kimlik – IIdentity arabirimini uygulayan bir nesne döndüren bir özellik. IIdentity arabirimi üç özellik tanımlar: AuthenticationType, IsAuthenticated ve Name.
Aşağıdaki kodu kullanarak mevcut ziyaretçinin adını belirleyebiliriz:
dize currentUsersName = User.Identity.Name;
Form kimlik doğrulaması kullanılırken, GenericPrincipal'ın Identity özelliği için bir FormsIdentity nesnesi oluşturulur. FormsIdentity sınıfı her zaman AuthenticationType özelliği için "Forms" dizesini ve IsAuthenticated özelliği için true dizesini döndürür. Name özelliği, form kimlik doğrulama bileti oluşturulurken belirtilen kullanıcı adını döndürür. Bu üç özelliğe ek olarak, FormsIdentity özelliği aracılığıyla temel alınan kimlik doğrulama biletine Ticket erişimi içerir. Ticket özelliği, Expiration, IsPersistent, IssueDate, Name vb. özelliklere sahip FormsAuthenticationTicket türünde bir nesne döndürür.
Burada çıkarılması gereken önemli nokta, FormsAuthentication.GetAuthCookie(username, persistCookie), FormsAuthentication.SetAuthCookie(username, persistCookie) ve FormsAuthentication.RedirectFromLoginPage(username, persistCookie) method'larında belirtilen username parametresinin User.Identity.Name tarafından döndürülen değerle aynı olmasıdır. Ayrıca, bu yöntemler tarafından oluşturulan kimlik doğrulama bileti, User.Identity bir FormsIdentity nesnesine dönüştürülerek ve ardından Ticket özelliğine erişilerek kullanılabilir:
FormsIdentity ident = User.Identity as FormsIdentity;
FormsAuthenticationTicket authTicket = ident.Ticket;
Default.aspx'da daha kişiselleştirilmiş bir mesaj verelim. WelcomeBackMessage Label'ın Text özelliğine "Tekrar hoş geldiniz, kullanıcı adı!" dizesi atanacak şekilde Page_Load olay işleyicisini güncelleştirin.
WelcomeBackMessage.Text = "Tekrar hoş geldiniz, " + User.Identity.Name + "!";
Şekil 13, bu değişikliğin etkisini göstermektedir (Scott kullanıcısı olarak oturum açarken).
Şekil 13: Hoş Geldiniz Mesajı, Şu Anda Oturum Açmış Kullanıcının Adını İçerir
LoginView ve LoginName Denetimlerini Kullanma
Kimliği doğrulanmış ve anonim kullanıcılara farklı içerik görüntülemek yaygın bir gereksinimdir; şu anda oturum açmış olan kullanıcının adı da görüntüleniyor. Bu nedenle, ASP.NET, Şekil 13'te gösterilen işlevselliğin aynısını sağlayan, ancak tek bir kod satırı yazmaya gerek kalmadan iki Web denetimi içerir.
LoginView denetimi, kimliği doğrulanmış ve anonim kullanıcılara farklı veriler görüntülemeyi kolaylaştıran şablon tabanlı bir Web denetimidir. LoginView önceden tanımlanmış iki şablon içerir:
- AnonymousTemplate – bu şablona eklenen herhangi bir işaretleme yalnızca anonim ziyaretçilere görüntülenir.
- LoggedInTemplate – bu şablonun işaretlemesi yalnızca kimliği doğrulanmış kullanıcılara gösterilir.
LoginView denetimini sitemizin ana sayfası olan Site.master'a ekleyelim. Yalnızca LoginView denetimini eklemek yerine, hem yeni bir ContentPlaceHolder denetimi ekleyelim hem de LoginView denetimini bu yeni ContentPlaceHolder'ın içine yerleştirelim. Bu kararın gerekçesi kısa süre içinde ortaya çıkacaktır.
Uyarı
AnonimŞablon ve LoggedInTemplate'e ek olarak, LoginView denetimi role özgü şablonlar içerebilir. Role özgü şablonlar, yalnızca belirli bir role ait olan kullanıcılara işaretleme gösterir. LoginView denetiminin rol tabanlı özelliklerini gelecekteki bir öğreticide inceleyeceğiz.
Gezinti <div> öğesi içindeki ana sayfaya LoginContent adlı bir ContentPlaceHolder ekleyerek başlayın. Bir ContentPlaceHolder denetimini Araç Kutusu'ndan Kaynak görünümüne sürükleyebilir ve elde edilen işaretlemeyi "TODO: Menu will go here..." öğesinin hemen üzerine yerleştirebilirsiniz. Metin.
<div id="navigation">
<asp:ContentPlaceHolder ID="LoginContent" runat="server">
</asp:ContentPlaceHolder>
TODO: Menu will go here...
</div>
Ardından, LoginContent ContentPlaceHolder içine bir LoginView denetimi ekleyin. Ana sayfanın ContentPlaceHolder denetimlerine yerleştirilen içerik, ContentPlaceHolder için varsayılan içerik olarak kabul edilir. Diğer bir deyişle, bu ana sayfayı kullanan ASP.NET sayfalar her ContentPlaceHolder için kendi içeriklerini belirtebilir veya ana sayfanın varsayılan içeriğini kullanabilir.
LoginView ve oturum açmayla ilgili diğer denetimler, Toolbox'ın Oturum Açma sekmesinde bulunur.
Şekil 14: Araç Kutusu'ndaki LoginView Denetimi
Ardından, LoginView denetiminden hemen sonra, ancak yine de ContentPlaceHolder içinde iki <br /> öğesi ekleyin. Bu noktada, gezinme <div> öğesinin işaretlemesi aşağıdaki gibi görünmelidir:
<div id="navigation">
<asp:ContentPlaceHolder ID="LoginContent" runat="server">
<asp:LoginView ID="LoginView1" runat="server">
</asp:LoginView>
<br /><br />
</asp:ContentPlaceHolder>
TODO: Menu will go here...
</div>
LoginView'ın şablonları Tasarımcı'dan veya bildirim temelli işaretlemeden tanımlanabilir. Visual Studio'nun Tasarımcısı'ndan, yapılandırılan şablonları bir açılan listede listeleyen LoginView'ın akıllı etiketini genişletin. AnonymousTemplate'e "Merhaba, yabancı" metnini yazın; Ardından, bir HyperLink denetimi ekleyin ve Text ve NavigateUrl özelliklerini sırasıyla "Log In" ve "~/Login.aspx" olarak ayarlayın.
AnonymousTemplate'i yapılandırdıktan sonra LoggedInTemplate'e geçin ve "Tekrar hoş geldiniz" metnini girin. Ardından bir LoginName denetimini Araç Kutusu'ndan LoggedInTemplate'e sürükleyin ve "Tekrar hoş geldiniz," metninin hemen arkasına yerleştirin. LoginName denetimi, adından da anlaşılacağı gibi, şu anda oturum açmış olan kullanıcının adını görüntüler. Dahili olarak, LoginName denetimi yalnızca User.Identity.Name özelliğini çıkarır
LoginView şablonlarına bu eklemeleri yaptıktan sonra, işaretleme aşağıdakine benzer görünmelidir:
<div id="navigation">
<asp:ContentPlaceHolder ID="LoginContent" runat="server">
<asp:LoginView ID="LoginView1" runat="server">
<LoggedInTemplate>
Welcome back,
<asp:LoginName ID="LoginName1" runat="server" />.
</LoggedInTemplate>
<AnonymousTemplate>
Hello, stranger.
<asp:HyperLink ID="lnkLogin" runat="server" NavigateUrl="~/Login.aspx">Log In</asp:HyperLink>
</AnonymousTemplate>
</asp:LoginView>
<br /><br />
</asp:ContentPlaceHolder>
TODO: Menu will go here...
</div>
Site.master ana sayfasına yapılan bu eklemeyle, web sitemizdeki her sayfa, kullanıcının kimliğinin doğrulanıp doğrulanmadığına bağlı olarak farklı bir ileti görüntüler. Şekil 15, Jisun kullanıcısı tarafından bir tarayıcı aracılığıyla ziyaret edildiğinde Default.aspx sayfayı göstermektedir. "Tekrar hoş geldin, Jisun" mesajı iki kez tekrarlanır: bir kez ana sayfanın soldaki gezinme bölümünde (az önce eklediğimiz LoginView kontrolü aracılığıyla) ve bir kez Default.aspx içerik alanında (Panel kontrolleri ve programlama mantığı aracılığıyla).
Şekil 15: LoginView Kontrolünde "Tekrar hoş geldiniz, Jisun" mesajı görüntüleniyor.
LoginView'ı ana sayfaya eklediğimiz için sitemizdeki her sayfada görünebilir. Ancak, bu mesajı göstermek istemediğimiz web sayfaları olabilir. Böyle bir sayfa, oturum açma sayfasıdır, çünkü oturum açma sayfasına bir bağlantı orada yerinde görünmüyor. LoginView denetimini ana sayfadaki bir ContentPlaceHolder'a yerleştirdiğimizden, içerik sayfamızda bu varsayılan işaretlemeyi geçersiz kılabiliriz. Login.aspx'yi açın ve Tasarımcı'ya gidin. Ana sayfadaki LoginContent ContentPlaceHolder için Login.aspx'da açıkça bir İçerik denetimi tanımlamadığımız için, oturum açma sayfası bu ContentPlaceHolder için ana sayfanın varsayılan işaretlemesini gösterir. Bunu Tasarımcı aracılığıyla görebilirsiniz – LoginContent ContentPlaceHolder varsayılan işaretlemeyi (LoginView denetimi) gösterir.
Şekil 16: Oturum Açma Sayfası, Ana Sayfanın LoginContent ContentPlaceHolder'ı için Varsayılan İçeriği Gösterir (Tam boyutlu görüntüyü görüntülemek için tıklayın)
LoginContent ContentPlaceHolder için varsayılan işaretlemeyi geçersiz kılmak için Tasarımcı'da bölgeye sağ tıklayın ve bağlam menüsünden Özel İçerik Oluştur seçeneğini belirleyin. (Visual Studio 2008 kullanırken, ContentPlaceHolder seçildiğinde aynı seçeneği sunan bir akıllı etiket içerir.) Bu, sayfanın işaretlemesine yeni bir İçerik denetimi ekler ve böylece bu sayfa için özel içerik tanımlamamıza olanak tanır. Buraya "Lütfen giriş yapın" gibi özel bir mesaj ekleyebilirsiniz, ancak bunu boş bırakalım.
Uyarı
Visual Studio 2005'te, özel içerik oluşturmak ASP.NET sayfada boş bir İçerik denetimi oluşturur. Ancak Visual Studio 2008 uygulamasında, özel içerik oluşturmak ana sayfanın varsayılan içeriğini yeni oluşturulan İçerik denetimine kopyalar. Visual Studio 2008 kullanıyorsanız, yeni İçerik denetimini oluşturduktan sonra, ana sayfadan kopyalanan içeriği temizlediğinizden emin olun.
Şekil 17'de, bu değişiklik yapıldıktan sonra bir tarayıcıdan ziyaret edildiğinde Login.aspx sayfası gösterilmektedir. Sol gezinme divinde< Default.aspx ziyaret ederken olduğu gibi "Merhaba, yabancı" veya "Tekrar hoş geldiniz, >" mesajı olmadığını unutmayın.
Şekil 17: Oturum Açma Sayfası Varsayılan LoginContent ContentPlaceHolder'ın İşaretlemesini Gizliyor (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Adım 5: Oturumu Kapatma
3. Adımda, bir kullanıcının siteye giriş yapmasını sağlamak için bir giriş sayfası oluşturmaya baktık, ancak bir kullanıcının oturumunu nasıl kapatacağımızı henüz görmedik. FormsAuthentication sınıfı, bir kullanıcının oturum açma yöntemlerine ek olarak bir SignOut yöntemi de sağlar. SignOut yöntemi yalnızca form kimlik doğrulama biletini yok eder ve böylece kullanıcının site oturumunu kapatır.
Bir oturum kapatma bağlantısı sunmak o kadar yaygın bir özelliktir ki, ASP.NET kullanıcının oturumunu kapatmak için özel olarak tasarlanmış bir denetim içerir. LoginStatus denetimi , kullanıcının kimlik doğrulama durumuna bağlı olarak bir "Oturum Açma" LinkButton veya "Oturumu Kapat" LinkButton görüntüler. Anonim kullanıcılar için bir "Oturum Aç" LinkButton oluşturulurken, kimliği doğrulanmış kullanıcılar için bir "Oturumu Kapat" LinkButton görüntülenir. "Oturum Açma" ve "Oturum Kapatma" LinkButtons metni, LoginStatus'un LoginText ve LogoutText özellikleri aracılığıyla yapılandırılabilir.
"Giriş" LinkButton'a tıklamak, giriş sayfasına bir yönlendirmenin yapıldığı bir geri göndermeye neden olur. "Logout" LinkButton'a tıklamak, LoginStatus denetiminin FormsAuthentication.SignOff yöntemini çağırmasına neden olur ve ardından kullanıcıyı bir sayfaya yönlendirir. Oturumu kapatılan kullanıcının yönlendirildiği sayfa, aşağıdaki üç değerden birine atanabilen LogoutAction özelliğine bağlıdır:
- Yenile – varsayılan; Kullanıcıyı az önce ziyaret ettikleri sayfaya yönlendirir. Az önce ziyaret ettikleri sayfa anonim kullanıcılara izin vermiyorsa, FormsAuthenticationModule kullanıcıyı otomatik olarak oturum açma sayfasına yönlendirir.
Burada neden bir yönlendirme yapıldığını merak ediyor olabilirsiniz. Kullanıcı aynı sayfada kalmak istiyorsa, neden açık yönlendirmeye ihtiyaç duyulsun? Bunun nedeni, "Oturumu Kapat" LinkButton tıklatıldığında, kullanıcının tanımlama bilgileri koleksiyonunda hala form kimlik doğrulama biletine sahip olmasıdır. Sonuç olarak, geri gönderme isteği kimliği doğrulanmış bir istektir. LoginStatus denetimi SignOut yöntemini çağırır, ancak bu FormsAuthenticationModule kullanıcının kimliğini doğruladıktan sonra gerçekleşir. Bu nedenle, açık bir yönlendirme, tarayıcının sayfayı yeniden istemesine neden olur. Tarayıcı sayfayı yeniden istediğinde, form kimlik doğrulama bileti kaldırılmıştır ve bu nedenle gelen istek anonimdir.
- Yönlendirme – kullanıcı, LoginStatus'un LogoutPageUrl özelliği tarafından belirtilen URL'ye yönlendirilir.
- RedirectToLoginPage – kullanıcı oturum açma sayfasına yönlendirilir.
Ana sayfaya bir LoginStatus denetimi ekleyelim ve bunu, kullanıcıyı oturumunun kapatıldığını onaylayan bir ileti görüntüleyen bir sayfaya göndermek için Yeniden Yönlendirme seçeneğini kullanacak şekilde yapılandıralım. Kök dizinde Logout.aspx adlı bir sayfa oluşturarak başlayın. Bu sayfayı Site.master ana sayfasıyla ilişkilendirmeyi unutmayın. Ardından, sayfanın işaretlemesine kullanıcıya oturumunun kapatıldığını açıklayan bir mesaj girin.
Ardından, Site.master ana sayfasına dönün ve LoginContent ContentPlaceHolder'daki LoginView'ın altına bir LoginStatus denetimi ekleyin. LoginStatus denetiminin LogoutAction özelliğini Yeniden Yönlendir ve LogoutPageUrl özelliğini "~/Logout.aspx" olarak ayarlayın.
<div id="navigation">
<asp:ContentPlaceHolder ID="LoginContent" runat="server">
<asp:LoginView ID="LoginView1" runat="server">
<LoggedInTemplate>
Welcome back,
<asp:LoginName ID="LoginName1" runat="server" />.
</LoggedInTemplate>
<AnonymousTemplate>
Hello, stranger.
<asp:HyperLink ID="lnkLogin" runat="server" NavigateUrl="~/Login.aspx">Log In</asp:HyperLink>
</AnonymousTemplate>
</asp:LoginView>
<br />
<asp:LoginStatus ID="LoginStatus1" runat="server" LogoutAction="Redirect" LogoutPageUrl="~/Logout.aspx" />
<br /><br />
</asp:ContentPlaceHolder>
TODO: Menu will go here...
</div>
LoginStatus LoginView denetiminin dışında olduğundan, hem anonim hem de kimliği doğrulanmış kullanıcılar için görünür, ancak LoginStatus bir "Login" veya "Logout" LinkButton'ı doğru şekilde görüntüleyeceğinden bu sorun değildir. LoginStatus denetiminin eklenmesiyle, AnonymousTemplate'deki "Oturum Aç" Köprüsü gereksizdir, bu nedenle kaldırın.
Şekil 18, Jisun'un ziyaret ettiği Default.aspx göstermektedir. Sol sütunda, oturumu kapatmak için bir bağlantıyla birlikte "Tekrar hoş geldiniz, Jisun" mesajının görüntülendiğini unutmayın. Oturumu kapat LinkButton'a tıklamak bir geri göndermeye neden olur, Jisun'un sistemden çıkışını yapar ve ardından onu Logout.aspx'a yönlendirir. Şekil 19'un gösterdiği gibi, Jisun Logout.aspx ulaştığında zaten oturumu kapatılmıştır ve bu nedenle anonimdir. Sonuç olarak, sol sütunda "Hoş geldiniz, yabancı" metni ve oturum açma sayfasına bir bağlantı gösterilir.
Şekil 18: Default.aspx "Tekrar Hoş Geldiniz, Jisun" Ve "Oturumu Kapat" LinkButton Gösteriliyor (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Şekil 19: Logout.aspx "Hoş Geldiniz, yabancı" ve "Oturum Aç" LinkButton Gösterilir (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Uyarı
Ana sayfanın LoginContent ContentPlaceHolder'ını gizlemek için Logout.aspx sayfayı özelleştirmenizi öneririm (Adım 4'te Login.aspx için yaptığımız gibi). Bunun nedeni, LoginStatus denetimi tarafından işlenen "Login" LinkButton'ın ("Merhaba, yabancı"nın altındaki) kullanıcıyı ReturnUrl sorgu dizesi parametresinde geçerli URL'yi geçirerek oturum açma sayfasına göndermesidir. Kısacası, oturumu kapatan bir kullanıcı bu LoginStatus'un "Oturum Aç" LinkDüğmesine tıklar ve ardından oturum açarsa, Logout.aspx geri yönlendirilir ve bu da kullanıcının kafasını kolayca karıştırabilir.
Özet
Bu öğreticide, form kimlik doğrulaması iş akışının incelenmesiyle başladık ve ardından bir ASP.NET uygulamasında form kimlik doğrulaması uygulamaya geçtik. Form kimlik doğrulaması, iki sorumluluğu olan FormsAuthenticationModule tarafından desteklenir: kullanıcıları form kimlik doğrulama biletlerine göre tanımlama ve yetkisiz kullanıcıları oturum açma sayfasına yönlendirme.
.NET Framework'ün FormsAuthentication sınıfı, form kimlik doğrulama biletleri oluşturma, inceleme ve kaldırma yöntemlerini içerir. Request.IsAuthenticated özelliği ve User nesnesi, bir isteğin kimliğinin doğrulanıp doğrulanmadığını belirlemek ve kullanıcının kimliği hakkında bilgi edinmek için ek programlama desteği sağlar. Ayrıca, geliştiricilere oturum açmayla ilgili birçok yaygın görevi gerçekleştirmek için hızlı ve kodsuz bir yol sağlayan LoginView, LoginStatus ve LoginName Web denetimleri de vardır. Bu ve oturum açmayla ilgili diğer Web denetimlerini gelecekteki eğitimlerde daha ayrıntılı olarak inceleyeceğiz.
Bu öğretici, form kimlik doğrulamasına üstünkörü bir genel bakış sağladı. Çeşitli yapılandırma seçeneklerini incelemedik, tanımlama bilgisi olmayan form kimlik doğrulama biletlerinin nasıl çalıştığına bakmadık veya form kimlik doğrulama biletinin içeriğini nasıl ASP.NET koruduğunu keşfetmedik.
Mutlu Programlama!
Daha Fazla Okuma
Bu öğreticide ele alınan konular hakkında daha fazla bilgi için aşağıdaki kaynaklara bakın:
- IIS6 ve IIS7 Güvenliği Arasındaki Değişiklikler
- Giriş ASP.NET Kontrolleri
- Profesyonel ASP.NET 2.0 Güvenlik, Üyelik ve Rol Yönetimi (ISBN: 978-0-7645-9698-8)
-
<authentication>
Öğesi -
Eleman
<forms>
için<authentication>
Bu Öğreticide Yer Alan Konulara Yönelik Video Eğitimi
Yazar Hakkında
Yedi 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 24 Hours 2.0'dır. Ona adresinden mitchell@4GuysFromRolla.comulaşabilirsiniz.
Özel Teşekkürler...
Bu eğitim serisi, birçok yararlı kişi tarafından incelendi. Bu öğreticinin baş gözden geçireni, bu öğretici serisi birçok yararlı gözden geçiren tarafından gözden geçirildi. Bu öğreticinin baş gözden geçirenleri arasında Alicja Maziarz, John Suru ve Teresa Murphy yer alır. Yaklaşan MSDN makalelerimi gözden geçirmek istiyor musunuz? Öyleyse, mitchell@4GuysFromRolla.com'a bir mesaj bırakın.