Form Kimlik Doğrulamasına Genel Bakış (C#)

tarafından Scott Mitchell

Not

Bu makale yazıldığından beri, ASP.NET Üyeliği sağlayıcılarının yerini ASP.NET Identity alır. Bu makalenin yazıldığı sırada öne çıkan Üyelik sağlayıcıları yerine ASP.NET Kimlik platformunu kullanmak için uygulamaları güncelleştirmenizi kesinlikle öneririz. ASP.NET Identity, ASP.NET Üyelik sistemine göre çeşitli avantajlara sahiptir, örneğin:

  • 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

Kod İndirme veya PDF İndirme

Bu öğreticide yalnızca tartışmadan uygulamaya geçiş yapacağız; özellikle form kimlik doğrulamasını uygulamaya bakacağız. Bu öğreticide kurmaya başladığımız web uygulaması, basit form kimlik doğrulamasından üyelik ve rollere geçiş yaptığımız için sonraki öğreticilerde oluşturulmaya devam edecektir.

Bu konu hakkında daha fazla bilgi için lütfen bu videoya bakın: ASP.NET'de 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 öğreticide yalnızca tartışmadan uygulamaya geçiş yapacağız; özellikle form kimlik doğrulamasını uygulamaya bakacağız. Bu öğreticide kurmaya başladığımız web uygulaması, basit form kimlik doğrulamasından üyelik ve rollere geçiş yaptığımız için sonraki öğreticilerde oluşturulmaya devam edecektir.

Bu öğretici, önceki öğreticide değindiğimiz forms kimlik doğrulaması iş akışına ayrıntılı bir bakışla başlar. Bundan sonra, form kimlik doğrulaması kavramlarını indirgemek için bir ASP.NET web sitesi oluşturacağız. Ardından, siteyi form kimlik doğrulamasını kullanacak, basit bir oturum açma sayfası oluşturacak ve kodda bir kullanıcının kimliğinin doğrulanıp doğrulanmamış olduğunu ve varsa oturum açtığı kullanıcı adını nasıl belirleyebileceğimizi göreceğiz.

Form kimlik doğrulaması iş akışını anlamak, bir web uygulamasında etkinleştirmek ve oturum açma ve oturum kapatma sayfalarını oluşturmak, 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 önemli adımlarıdır. Bu yüzden – ve bu öğreticiler birbirleri üzerine inşa edildiğinden , geçmiş projelerde form kimlik doğrulamasını yapılandırma deneyimine sahip olsanız bile bir sonrakine geçmeden önce bu öğreticiyi tam olarak gözden geçirmenizi tavsiye ederim.

Forms 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 istek işlediğinde, istek yaşam döngüsü boyunca bir dizi olay oluşturur. İsteğin en başında ve sonunda, isteğin kimliği doğrulandığında ve yetkilendirildiğinde tetiklenen olaylar, işlenmeyen bir özel durum söz konusu olduğunda tetiklenen bir olay vb. vardır. Olayların tam listesini görmek için HttpApplication nesnesinin olaylarına bakın.

HTTP Modülleri , istek yaşam döngüsündeki belirli bir olaya yanıt olarak kodu yürütülen yönetilen sınıflardır. ASP.NET arka planda temel görevleri yerine getiren bir dizi HTTP Modülü ile birlikte sağlanır. Tartışmamıza ö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 – geçerli kullanıcının istenen URL'ye erişme yetkisi olup olmadığını belirler. Bu modül, uygulamanın yapılandırma dosyalarında belirtilen yetkilendirme kurallarına başvurarak yetkiliyi belirler. ASP.NET ayrıca istenen dosya veya ACL'lere başvurarak yetkiliyi belirleyen öğesini de içerir FileAuthorizationModule .

FormsAuthenticationModule(ve FileAuthorizationModule) yürütülmadan önce UrlAuthorizationModule kullanıcının kimliğini doğrulama denemeleri. İ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 durumunu 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 kullanıcıdan kimlik bilgilerini kalıcı bir iletişim kutusu aracılığıyla istemesine neden olur. Ancak Forms Kimlik Doğrulaması ile, FormsAuthenticationModule bu durumu algıladığı ve kullanıcıyı bunun yerine oturum açma sayfasına yönlendirecek şekilde değiştirdiğinden ( HTTP 302 Yeniden Yönlendirme durumu aracılığıyla) HTTP 401 Yetkisiz durumu hiçbir zaman tarayıcıya gönderilmez.

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ığı sayfaya geri yönlendirmektir. Kimlik doğrulama bileti, FormsAuthenticationModule web sitesindeki sayfalara yapılan ve kullanıcıyı tanımlamak için kullanılan sonraki isteklere eklenir.

Forms Kimlik Doğrulaması İş Akışı

Şekil 1: Forms Kimlik Doğrulaması İş Akışı

Sayfa Ziyaretleri Arasında Kimlik Doğrulama Biletini Anımsama

Oturum açtıktan sonra, kullanıcının siteye göz atarken oturum açmış durumda kalması için form kimlik doğrulama biletinin her istekte web sunucusuna geri gönderilmesi gerekir. Bu genellikle kimlik doğrulama anahtarını kullanıcının tanımlama bilgileri koleksiyonuna yerleştirerek gerçekleştirilir. Tanımlama bilgileri , kullanıcının bilgisayarında bulunan küçük metin dosyalarıdır ve her istekteki HTTP üst bilgilerinde tanımlama bilgisini oluşturan web sitesine iletilir. Bu nedenle, form kimlik doğrulama bileti oluşturulduktan ve tarayıcının tanımlama bilgilerinde depolandı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.

Tanımlama bilgilerinin bir yönü, tarayıcının çerezi attığı tarih ve saat olan süre sonudur. Form kimlik doğrulaması 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ı genel terminalden ziyaret ederken, tarayıcısını kapattığında kimlik doğrulama biletinin süresinin dolmasını isteme olasılığı vardır. Ancak, aynı kullanıcı evden ziyaret ederken, siteyi her ziyaret ettiğinde yeniden oturum açmaları gerekmemesi için tarayıcı yeniden başlatmalarında kimlik doğrulama biletinin anımsanmasını isteyebilir. Bu karar genellikle kullanıcı tarafından oturum açma sayfasında "Beni hatırla" onay kutusu biçiminde alınır. 3. Adımda oturum açma sayfasında "Beni anımsa" 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ınır.

Not

Web sitesinde oturum açmak için kullanılan kullanıcı aracısı tanımlama bilgilerini desteklemeyebilir. Böyle bir durumda, ASP.NET tanımlama bilgisi olmayan formlar kimlik doğrulama biletlerini kullanabilir. Bu modda, kimlik doğrulama bileti URL'ye kodlanır. Tanımlama bilgisi olmayan kimlik doğrulama biletlerinin ne zaman kullanıldığına ve bunların bir sonraki öğreticide nasıl oluşturulduğuna ve yönetileceğine bakacağız.

Form Kimlik DoğrulamasıNın Kapsamı

, FormsAuthenticationModule ASP.NET çalışma zamanının 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 ayrı bir engel vardı. Kısacası, IIS 6 ve önceki sürümlerde yalnızca FormsAuthenticationModule 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 görüntü dosyaları gibi) işler ve .aspx, .asmx veya .ashx uzantısına sahip bir sayfa istendiğinde istekleri yalnızca ASP.NET çalışma zamanına devreder.

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'u çağıracak şekilde ayarlayabilirsiniz. Ayrıca IIS 7 ile her tür dosya için URL yetkilendirme kuralları tanımlayabilirsiniz. Daha fazla bilgi için bkz. IIS6 ile IIS7 Güvenliği Arasındaki Değişiklikler, Web Platform Güvenliğiniz ve IIS7 URL Yetkilendirmesini Anlama.

Uzun lafın kısası, IIS 7 öncesi sürümlerde form kimlik doğrulamasını yalnızca ASP.NET çalışma zamanı tarafından işlenen kaynakları korumak için 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'u IIS'nin HTTP işlem hattıyla tümleştirmek ve bu işlevselliği tüm isteklere genişletmek mümkündür.

1. Adım: Bu Öğretici Serisi için ASP.NET 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, Visual Web Developer 2008'in ücretsiz sürümüyle oluşturulacaktır. Kullanıcı depoyu SqlMembershipProvider bir Microsoft SQL Server 2005 Express Sürüm veritabanında uygulayacağız. Visual Studio 2005 veya visual studio 2008'in farklı bir sürümünü veya SQL Server kullanıyorsanız endişelenmeyin; adımlar neredeyse aynı olacak ve önemsiz olmayan farklara işaret edilecek.

Not

Her öğreticide kullanılan tanıtım web uygulaması indirme olarak kullanılabilir. 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 .NET 3.5'i henüz yüklemediyseniz, indirilebilir web uygulaması önce Web.config'dan 3.5'e özgü işaretlemeyi kaldırmadan çalışmaz.

Form kimlik doğrulamayı yapılandırabilmeniz için önce bir ASP.NET web sitesine ihtiyacımız vardır. Başlangıç olarak yeni bir dosya sistemi tabanlı ASP.NET web sitesi oluşturun. Bunu yapmak için Visual Web Developer'ı başlatın ve 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 işlem Default.aspx ASP.NET sayfası, App_Data klasörü ve Web.config dosyası içeren yeni bir web sitesi oluşturur.

Not

Visual Studio iki proje yönetimi modunu destekler: Web Sitesi Projeleri ve Web Uygulaması Projeleri. Web Sitesi Projelerinde proje dosyası yoktur, ancak 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 derlemede derler. Web Uygulaması Projesi modeli Service Pack 1 ile yeniden tanıtılsa da Visual Studio 2005 başlangıçta yalnızca desteklenen Web Sitesi Projeleri; Visual Studio 2008 her iki proje modeli 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 dışı 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üklerinizle izlemeniz gereken adımlar arasında gösterilen ekran görüntüleriyle bu öğreticilerde sağlanan yönergeler arasında bazı tutarsızlıklar olabileceğini unutmayın.

Web Sitesi System-Based Yeni Dosya Oluşturma

Ş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 dizinde siteye yeni bir Ana Sayfa ekleyin. Ana sayfalar, sayfa geliştiricinin ASP.NET sayfalara uygulanabilecek site genelinde bir şablon tanımlamasını sağlar. Ana sayfaların temel avantajı, sitenin genel görünümünün tek bir konumda tanımlanabilmesi ve böylece sitenin düzeninin güncelleştirilmasını veya düzenlenmesinin kolay hale getirilmesidir.

Web Sitesine Site.master Adlı Bir Ana Sayfa Ekleme

Şekil 3: Web Sitesine Site.master Adlı Bir Ana Sayfa Ekleme (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Site genelinde 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 veya işaretlemeyi Kaynak görünümünde el ile ekleyebilirsiniz. ASP.NET 2.0 öğretici serisinde Verilerle Çalışma öğretici serimde kullanılan düzeni taklit etmek için ana sayfamın düzenini yapılandırdım (bkz. Şekil 4). Ana sayfa, dosya Style.css (bu öğreticinin ilişkili indirmesinde bulunur) tanımlanan CSS ayarlarıyla konumlandırma ve stiller için basamaklı stil sayfaları kullanır. Aşağıda gösterilen işaretlemeden bunu anlayamazsınız, ancak CSS kuralları, gezinti <div'inin> içeriğinin solda görünecek şekilde kesinlikle konumlandırılması ve sabit genişliği 200 piksel olacak şekilde tanımlanı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 <div> içinde görülebilen denetim tarafından ContentPlaceHolder gösterilir. Ana sayfamızın tek ContentPlaceHolder bir (MainContent) vardır, ancak ana sayfalarda birden çok ContentPlaceHolder olabilir.

Yukarıda işaretleme girildiğinde 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 MainContent işaretlemeyi belirtme özelliğine sahip bu tekdüzen düzene sahip olur.

Tasarım Görünümü Aracılığıyla Görüntülendiğinde Ana Sayfa

Şekil 4: Tasarım Görünümü Aracılığıyla 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 sayfası var, ancak yeni oluşturduğumuz ana sayfayı kullanmıyor. Web sayfasının bildirim temelli işaretlemesini ana sayfa kullanacak şekilde değiştirmek mümkün olsa da, sayfa henüz herhangi bir içerik içermiyorsa, kullanılacak ana sayfayı belirterek sayfayı silip projeye yeniden eklemek daha kolaydır. Bu nedenle, projeden Default.aspx silerek başlayın.

Ardından, Çözüm Gezgini 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.ana ana sayfasını seçin.

Ana Sayfa Seçmek için Yeni Default.aspx Sayfası Ekleme

Şekil 5: Yeni Default.aspx Sayfası Ekleme Ana Sayfa Seçmek için Seçme (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Site.master Ana Sayfasını Kullanma

Şekil 6: Site.master Ana Sayfasını Kullanma

Not

Web Uygulaması Proje Modeli kullanıyorsanız, Yeni Öğe Ekle iletişim kutusu "Ana sayfayı seç" onay kutusu içermez. Bunun yerine, "Web İçerik Formu" türünde bir öğe eklemeniz gerekir. "Web İçerik Formu" seçeneğini belirleyip Ekle'ye tıkladıktan sonra Visual Studio, Şekil 6'da gösterilen Aynı Ana Şablon Seç iletişim kutusunu 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önergeyi ve ana sayfanın MainContent ContentPlaceHolder'ı için İçerik denetimini 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 öğreticinin ilerleyen bölümlerinde bu öğreticiye geri döneceğiz.

Not

Ana sayfamız bir menü veya başka bir gezinti arabirimi için bir bölüm içerir. Gelecekteki bir öğreticide böyle bir arabirim oluşturacağız.

2. Adım: Form Kimlik Doğrulamasını Etkinleştirme

ASP.NET web sitesi oluşturulduktan sonra, sıradaki görevimiz form kimlik doğrulamasını etkinleştirmektir. Uygulamanın kimlik doğrulama yapılandırması Web.config öğesi aracılığıyla <authentication> belirtilir. öğesi, <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 web sayfasındaki bir form aracılığıyla doğrulanır.
  • Passport– Kullanıcıların kimlikleri Microsoft'un Passport Ağı kullanılarak doğrulanır.
  • Hiçbiri– kimlik doğrulama modeli kullanılmaz; tüm ziyaretçiler anonimdir.

Varsayılan olarak, ASP.NET uygulamalar Windows kimlik doğrulamayı kullanır. Kimlik doğrulama türünü Forms 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 proje adına sağ tıklayıp Yeni Öğe Ekle'yi seçip bir Web Yapılandırması dosyası ekleyerek şimdi bir dosya ekleyin.

Projeniz henüz Web.config içermiyorsa şimdi ekleyin

Şekil 7: Projeniz henüz Web.config içermiyorsa Şimdi Ekle (tam boyutlu görüntüyü görüntülemek için tıklayın)

Ardından öğesini bulun <authentication> ve forms kimlik doğrulamasını kullanacak şekilde güncelleştirin. Bu değişiklik sonrasında Web.config dosyanızın işaretlemesi aşağıdakine benzer olmalıdır:

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

Not

Web.config bir XML dosyası olduğundan büyük/küçük harfle işaretleme önemlidir. Mode özniteliğini Büyük "F" ile Forms olarak ayarladığınızdan emin olun. "Formlar" gibi farklı bir büyük/küçük harf kullanırsanız, siteyi tarayıcı üzerinden ziyaret ederken bir yapılandırma hatası alırsınız.

<authentication> öğesi 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. Sonraki öğreticide <forms> alt öğeyi daha ayrıntılı olarak inceleyeceğiz.

3. Adım: Oturum Açma Sayfasını Oluşturma

Form kimlik doğrulamasını desteklemek için web sitemizin bir oturum açma sayfası olması gerekir. "Forms Kimlik Doğrulama İş Akışını Anlama" bölümünde açıklandığı gibi, FormsAuthenticationModule görüntüleme yetkisi olmayan bir sayfaya erişmeye çalışan kullanıcı otomatik olarak oturum açma sayfasına yönlendirilir. Ayrıca, anonim kullanıcılara oturum açma sayfasının bağlantısını görüntüleyen ASP.NET Web denetimleri de vardır. Bu, "Oturum açma sayfasının URL'si nedir?" sorusunu yanıtlar.

Varsayılan olarak, forms kimlik doğrulama sistemi oturum açma sayfasının Login.aspx olarak adlandırılıp web uygulamasının kök dizinine yerleştirilmesini bekler. Farklı bir oturum açma sayfası URL'si kullanmak istiyorsanız, bunu Web.config'de belirterek yapabilirsiniz. Bunu sonraki öğreticide nasıl yapacağımızı göreceğiz.

Oturum açma sayfasının üç sorumluluğu vardır:

  1. Ziyaretçinin kimlik bilgilerini girmesini sağlayan bir arabirim sağlayın.
  2. Gönderilen kimlik bilgilerinin geçerli olup olmadığını belirleyin.
  3. Forms kimlik doğrulama biletini oluşturarak kullanıcıyı "oturum açın".

Oturum Açma Sayfasının Kullanıcı Arabirimini Oluşturma

İlk görevi kullanmaya başlayalım. Sitenin kök dizinine Login.aspx adlı yeni bir ASP.NET sayfası ekleyin ve siteyi Site.master ana sayfasıyla ilişkilendirin.

Login.aspx Adlı Yeni ASP.NET Sayfası Ekleme

Şekil 8: Login.aspx Adlı Yeni ASP.NET Sayfası Ekleme (Tam boyutlu resmi görüntülemek için tıklayın)

Tipik oturum açma sayfası arabirimi, biri kullanıcı adı, biri parolası için olmak üzere iki metin kutusundan ve formu göndermeye yönelik bir düğmeden oluşur. Web siteleri genellikle tarayıcı yeniden başlatmalarında elde edilen kimlik doğrulama biletini kalıcı hale getiren bir "Beni anımsa" onay kutusu içerir.

Login.aspx iki TextBox ekleyin ve özelliklerini ID sırasıyla UserName ve Password olarak ayarlayın. Ayrıca Password özelliğini TextMode Password olarak ayarlayın. Ardından, özelliğini RememberMe ve Text özelliğini "Beni Anımsa" olarak ayarlayarak ID bir CheckBox denetimi ekleyin. Bundan sonra, özelliği "Login" olarak ayarlanmış LoginButton Text adlı bir Düğme ekleyin. Son olarak, bir Label Web denetimi ekleyin ve ID özelliğini InvalidCredentialsMessage, Text özelliğini "Kullanıcı adınız veya parolanız geçersiz. Lütfen yeniden deneyin.", ForeColor özelliği Red, Visible özelliği false olarak ayarlayın.

Bu noktada, ekranınız Şekil 9'daki ekran görüntüsüne benzer görünmelidir ve sayfanızın bildirim temelli söz dizimi 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>

Oturum Açma Sayfası İki Metin Kutusu, Bir Onay Kutusu, Bir Düğme ve Bir Etiket içerir

Şekil 9: Oturum Açma Sayfası İki Metin Kutusu, Onay Kutusu, Düğme ve Etiket içerir (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. bu olay işleyicisini oluşturmak için Tasarım Aracı Düğme denetimine çift tıklamanız yeterlidir.

Sağlanan Kimlik Bilgilerinin Geçerli Olup Olmadığını Belirleme

Şimdi Düğmenin Click olay işleyicisinde sağlanan kimlik bilgilerinin geçerli olup olmadığını belirlemek için 2. görevi 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'a başlamadan önce geliştiriciler hem kendi kullanıcı depolarını uygulamak hem de sağlanan kimlik bilgilerini depoya karşı doğrulamak için kodu yazmakla sorumludur. Çoğu geliştirici kullanıcı depoyu veritabanında uygulayarak UserName, Password, Email, LastLoginDate gibi sütunlara sahip Users adlı bir tablo oluşturur. Bu tablo, kullanıcı hesabı başına bir kayda sahip olacaktır. Kullanıcının sağladığı kimlik bilgilerinin doğrulanması, veritabanını eşleşen bir kullanıcı adı için sorgulamayı ve ardından veritabanındaki parolanın sağlanan parolaya karşılık geldiğinin güvence altına alınmasını gerektirir.

ASP.NET 2.0 ile geliştiriciler, kullanıcı depoyu 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'de Üyelik Şeması Oluşturma öğreticisinde bu şemanın nasıl uygulanacağını inceleyeceğiz. Üyelik sağlayıcısı yerinde olduğunda, kullanıcının kimlik bilgilerini doğrulamak Üyelik sınıfınınValidateUser (kullanıcı adı, parola) yöntemini çağırmak kadar basittir. Bu yöntem, kullanıcı adı ve parola bileşiminin geçerli olup olmadığını belirten bir Boole değeri döndürür. Henüz SqlMembershipProvider'ın kullanıcı depounu uygulamadığımıza göre, üyelik sınıfının ValidateUser yöntemini şu anda kullanamıyoruz.

Kendi özel Users veritabanı tablomuzu oluşturmak için zaman ayırarak (SqlMembershipProvider'ı uyguladıktan sonra kullanımdan kaldırılacaktır), bunun yerine oturum açma sayfasının içindeki 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ı vardır: Scott, Jisun ve Sam ve üçü de aynı parolaya ("parola") sahiptir. Kod, geçerli bir kullanıcı adı ve parola eşleşmesi bulmak için kullanıcılar ve parola dizileri arasında döngü oluşturur. Hem kullanıcı adı hem de parola geçerliyse, kullanıcıyı oturum açmamız ve ardından uygun sayfaya yeniden yönlendirmemiz gerekir. Kimlik bilgileri geçersizse InvalidCredentialsMessage Etiketini görüntüleriz.

Bir kullanıcı geçerli kimlik bilgilerini girdiğinde, daha sonra "uygun sayfaya" yönlendirildiğini söyledim. Yine de uygun sayfa hangisidir? Bir kullanıcı görüntüleme yetkisi olmayan bir sayfayı ziyaret ettiğinde FormsAuthenticationModule'un bunları otomatik olarak oturum açma sayfasına yönlendirdiğini unutmayın. Bunu yaparken, ReturnUrl parametresi aracılığıyla sorgu dizesinde istenen URL'yi içerir. Başka bir ifadeyle, bir kullanıcı ProtectedPage.aspx ziyaret etmeye çalıştıysa ve bunu yapma yetkisi yoksa FormsAuthenticationModule bunları şu adrese yönlendirir:

Login.aspx? ReturnUrl=ProtectedPage.aspx

Oturum başarıyla açıldıktan sonra kullanıcının ProtectedPage.aspx yeniden yönlendirilmesi gerekir. Alternatif olarak, kullanıcılar oturum açma sayfasını kendi talepleriyle ziyaret edebilir. Bu durumda, kullanıcı oturum açtıktan sonra kök klasörün Default.aspx sayfasına gönderilmelidir.

Kullanıcıda Oturum Açma

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ını sağlamalıyız. System.Web.Security ad alanındaFormsAuthentication sınıfı, forms kimlik doğrulama sistemi aracılığıyla kullanıcıların oturumunu açmak ve oturumu açmak 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 anahtarının içeriğini tutan bir HttpCookie nesnesi oluşturur ve döndürür. persistCookie true ise kalıcı bir tanımlama bilgisi oluşturulur.
  • SetAuthCookie(username, persistCookie) – Form kimlik doğrulama tanımlama bilgisini 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 bilgileri tabanlı form kimlik doğrulamasının kullanıldığı varsayılır; aksi takdirde, bu yöntem tanımlama bilgisi olmayan anahtar mantığını işleyen bir iç sınıfı çağırır).
  • RedirectFromLoginPage(username, persistCookie) – Bu yöntem SetAuthCookie(username, persistCookie) öğesini çağırır ve kullanıcıyı uygun sayfaya yönlendirir.

Tanımlama bilgisini Tanımlama Bilgileri koleksiyonuna yazmadan önce kimlik doğrulama biletini değiştirmeniz gerektiğinde GetAuthCookie kullanışlıdır. Form kimlik doğrulama biletini oluşturmak ve Tanımlama Bilgileri koleksiyonuna eklemek, ancak kullanıcıyı uygun sayfaya yönlendirmek istemiyorsanız SetAuthCookie yararlıdır. Bunları oturum açma sayfasında tutmak veya alternatif bir sayfaya göndermek isteyebilirsiniz.

Kullanıcıda oturum açmak ve bunları uygun sayfaya yönlendirmek istediğimizden RedirectFromLoginPage'i kullanalım. LoginButton'ın Click olay işleyicisini güncelleştirin ve açıklama satırı yapılan iki TODO satırını aşağıdaki kod satırıyla değiştirin:

FormsAuthentication.RedirectFromLoginPage(UserName.Text, RememberMe.Checked);

Forms kimlik doğrulama bileti oluştururken, forms kimlik doğrulama bileti kullanıcı adı parametresi için UserName TextBox'ın Text özelliğini ve persistCookie parametresi için RememberMe Onay Kutusu'nun denetlenen durumunu kullanırız.

Oturum açma sayfasını test etmek için tarayıcıda ziyaret edin. "Hayır" kullanıcı adı ve "yanlış" parolası 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.

Geçersiz Kimlik Bilgileri Girilirken InvalidCredentialsMessage Etiketi Görüntüleniyor

Ş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 Oturum Aç düğmesine tıklayın. Bu kez geri gönderme işlemi gerçekleştiğinde bir form kimlik doğrulama bileti oluşturulur ve otomatik olarak Default.aspx'e geri yönlendirilirsiniz. Şu anda oturum açtığınızı belirten görsel ipuçları olmasa da, bu noktada web sitesinde oturum açtınız. 4. Adımda, bir kullanıcının oturum açıp açmadığını program aracılığıyla belirlemenin yanı sıra sayfayı ziyaret eden kullanıcıyı nasıl tanımlayacağımızı göreceğiz.

5. Adım, bir kullanıcıyı web sitesinden günlüğe kaydetme tekniklerini inceler.

Oturum Açma Sayfasının Güvenliğini Sağlama

Kullanıcı kimlik bilgilerini girip oturum açma sayfası formunu gönderdiğinde, parola dahil olmak üzere kimlik bilgileri İnternet üzerinden web sunucusuna düz metin olarak iletilir. Bu, ağ trafiğini koklayan tüm korsanların kullanıcı adını ve parolayı 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 sayfanın HTML işaretlemesinin tamamının) tarayıcıdan ayrıldığı andan web sunucusu tarafından alınana kadar şifrelenmesini sağlar.

Web siteniz hassas bilgiler içermiyorsa, yalnızca oturum açma sayfasında ve kullanıcının parolasının düz metin olarak kablo üzerinden gönderileceği diğer sayfalarda SSL kullanmanız gerekir. Varsayılan olarak hem şifrelendiğinden hem de dijital olarak imzalandığından (kurcalamayı önlemek için) forms kimlik doğrulama biletinin güvenliğini sağlama konusunda endişelenmenize gerek yoktur. Form kimlik doğrulama bileti güvenliği hakkında daha kapsamlı bir tartışma aşağıdaki öğreticide sunulmuştur.

Not

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ılır. Böyle bir web sitesi oluşturuyorsanız forms kimlik doğrulama sistemini, form kimlik doğrulama biletinin yalnızca güvenli bir bağlantı üzerinden iletilmesi için yapılandırabilirsiniz.

4. Adım: Kimliği Doğrulanmış Ziyaretçileri Algılama ve Kimliklerini Belirleme

Bu noktada form kimlik doğrulamasını etkinleştirdik ve ilkel 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.

Şimdi bu teknikleri göstermek için mevcut Default.aspx sayfasını genişletelim. Default.aspx iki Panel denetimi ekleyin: biri AuthenticatedMessagePanel, diğeri de AnonymousMessagePanel adlı. İlk Panele WelcomeBackMessage adlı bir Etiket denetimi ekleyin. İkinci Panelde bir HyperLink denetimi ekleyin, Text özelliğini "Oturum Aç" 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>

Şimdiye kadar tahmin ettiğiniz gibi buradaki fikir, kimliği doğrulanmış ziyaretçiler için 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 uygulandığında tarayıcı üzerinden Default.aspx adresini ziyaret edin. Henüz oturum açmadığınız varsayıldığında, oturum açma sayfasının bağlantısını görürsünüz (bkz. Şekil 11). Bu bağlantıya tıklayın ve sitede oturum açın. 3. Adımda gördüğümüz gibi, kimlik bilgilerinizi girdikten sonra Default.aspx döndürülür, ancak bu kez sayfada "Geri Hoş Geldiniz!" iletisi gösterilir (bkz. Şekil 12).

Anonim Olarak Ziyaret Ettiğinizde Bir Oturum Açma Bağlantısı Görüntülenir

Şekil 11: Anonim Olarak Ziyaret Edildiğinde Bir Oturum Açma Bağlantısı Görüntülenir

Kimliği Doğrulanmış Kullanıcılar

Şekil 12: Kimliği Doğrulanmış Kullanıcılara "Geri Hoş Geldiniz!" 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 istek hakkındaki bilgileri temsil eder ve Yanıt, İstek ve Oturum gibi yaygın ASP.NET nesnelerinin ve diğerlerinin de giriş sayfasıdır. 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 olduğu roller hakkında bilgi sağlar. IPrincipal arabirimi iki üye tanımlar:

Geçerli ziyaretçinin adını aşağıdaki kodu kullanarak belirleyebiliriz:

currentUsersName = User.Identity.Name dizesi;

Forms 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, forms kimlik doğrulama bileti oluşturulurken belirtilen kullanıcı adını döndürür. Bu üç özelliğe ek olarak FormsIdentity, Ticket özelliği aracılığıyla temel alınan kimlik doğrulama biletine erişim içerir. Ticket özelliği, Expiration, IsPersistent, IssueDate, Name gibi özelliklere sahip FormsAuthenticationTicket türünde bir nesne döndürür.

Burada önemli nokta, FormsAuthentication.GetAuthCookie(username, persistCookie), FormsAuthentication.SetAuthCookie(username, persistCookie) ve FormsAuthentication.RedirectFromLoginPage(username, persistCookie) yöntemlerinde belirtilen kullanıcı adı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'i bir FormsIdentity nesnesine dönüştürüp Ticket özelliğine erişerek kullanılabilir:

FormsIdentity ident = User.Identity as FormsIdentity;
FormsAuthenticationTicket authTicket = ident.Ticket;

şimdi Default.aspx'da daha kişiselleştirilmiş bir ileti sunalım. Page_Load olay işleyicisini, WelcomeBackMessage Etiketi'nin Text özelliğine "Hoş Geldiniz, kullanıcı adı!" dizesinin atanması için güncelleştirin

WelcomeBackMessage.Text = "Hoş geldiniz, " + User.Identity.Name + "!";

Şekil 13'te bu değişikliğin etkisi gösterilmektedir (Scott kullanıcısı olarak oturum açarken).

Hoş Geldiniz iletisi şu anda oturum açmış olan kullanıcının adını içerir

Şekil 13: Hoş Geldiniz iletisi şu anda oturum açmış olan kullanıcının adını içerir

LoginView ve LoginName Denetimlerini Kullanma

Kimliği doğrulanmış ve anonim kullanıcılar için farklı içerik görüntülemek yaygın bir gereksinimdir; oturum açmış durumdaki kullanıcının adını görüntülemektir. Bu nedenle ASP.NET, Şekil 13'te gösterilen işlevlerin 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ılar için farklı verilerin görüntülenmesini kolaylaştıran şablon tabanlı bir Web denetimidir. LoginView önceden tanımlanmış iki şablon içerir:

  • AnonymousTemplate : Bu şablona eklenen tüm işaretlemeler 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.

Şimdi sitemizin ana sayfası olan Site.master'a LoginView denetimini ekleyelim. Ancak yalnızca LoginView denetimini eklemek yerine, hem yeni bir ContentPlaceHolder denetimi ekleyelim hem de LoginView denetimini bu yeni ContentPlaceHolder'a ekleyelim. Bu kararın mantığı kısa süre sonra ortaya çıkacaktır.

Not

AnonymousTemplate ve LoggedInTemplate'a ek olarak LoginView denetimi role özgü şablonlar içerebilir. Role özgü şablonlar, işaretlemeyi yalnızca belirli bir role ait olan kullanıcılara gösterir. Sonraki bir öğreticide LoginView denetiminin rol tabanlı özelliklerini inceleyeceğiz.

Gezinti <div> öğesinin içindeki ana sayfaya LoginContent adlı bir ContentPlaceHolder ekleyerek başlayın. Bir ContentPlaceHolder denetimini Araç Kutusundan Kaynak görünümüne sürükleyerek sonuçta elde edilen işaretlemeyi "TODO: Menü buraya gelecek..." 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. Başka bir ASP.NET, bu ana sayfayı kullanan 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 Araç Kutusu'nun Oturum Açma sekmesinde bulunur.

Araç Kutusundaki LoginView Denetimi

Şekil 14: Araç Kutusundaki LoginView Denetimi

Ardından, LoginView denetiminden hemen sonra, ancak yine de ContentPlaceHolder içinde iki <br /> öğe ekleyin. Bu noktada, gezinti <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 şablonları Tasarım Aracı veya bildirim temelli işaretlemeden tanımlanabilir. Visual Studio'nun Tasarım Aracı, LoginView'un yapılandırılmış şablonları açılan listede listeleyen akıllı etiketini genişletin. AnonymousTemplate içine "Hello, yabancı" metnini yazın; ardından bir HyperLink denetimi ekleyin ve Text ve NavigateUrl özelliklerini sırasıyla "Oturum Aç" ve "~/Login.aspx" olarak ayarlayın.

AnonymousTemplate'ı yapılandırdıktan sonra LoggedInTemplate'a geçin ve "Hoş geldiniz, " metnini girin. Ardından Araç Kutusu'ndan LogdInTemplate içine bir LoginName denetimi sürükleyerek "Geri hoş geldiniz, " metninin hemen arkasına yerleştirin. LoginName denetimi adından da anlaşılacağı gibi oturum açmış olan kullanıcının adını görüntüler. Dahili olarak, LoginName denetimi yalnızca User.Identity.Name özelliğinin çıkışını oluşturur

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 ek olarak, web sitemizdeki her sayfa kullanıcının kimliğinin doğrulanıp doğrulanmamış olduğuna bağlı olarak farklı bir ileti görüntüler. Şekil 15'te Jisun kullanıcısı tarafından tarayıcıda ziyaret edilen Default.aspx sayfası gösterilmektedir. "Geri hoş geldiniz, Jisun" iletisi iki kez yinelenir: bir kez soldaki ana sayfanın gezinti bölümüne (yeni eklediğimiz LoginView denetimi aracılığıyla) ve bir kez de Default.aspx içerik alanına (Panel denetimleri ve programlama mantığı aracılığıyla) gelir.

LoginView Denetimi Görüntülenir

Şekil 15: LoginView denetiminde "Geri hoş geldiniz, Jisun" görüntülenir.

LoginView'ı ana sayfaya eklediğimizden, sitemizdeki her sayfada görünebilir. Ancak, bu iletiyi göstermek istemediğimiz web sayfaları olabilir. Bu tür sayfalardan biri oturum açma sayfasıdır, çünkü oturum açma sayfasının bağlantısı orada uygun değil gibi görünür. LoginView denetimini ana sayfadaki ContentPlaceHolder'a yerleştirdiğimizden, içerik sayfamızda bu varsayılan işaretlemeyi geçersiz kılabiliriz. Login.aspx açın ve Tasarım Aracı gidin. Ana sayfada LoginContent ContentPlaceHolder için Login.aspx'de bir İçerik denetimini açıkça 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ım Aracı görebilirsiniz; LoginContent ContentPlaceHolder varsayılan işaretlemeyi (LoginView denetimi) gösterir.

Oturum Açma Sayfası, Ana Sayfanın LoginContent ContentPlaceHolder için Varsayılan İçeriği 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ım Aracı bölgede sağ tıklayıp bağlam menüsünden Özel İçerik Oluştur seçeneğini belirlemeniz yeterlidir. (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 oturum açın..." gibi özel bir ileti ekleyebilirsiniz, ancak bunu boş bırakalım.

Not

Visual Studio 2005'te özel içerik oluşturmak, ASP.NET sayfasında boş bir İçerik denetimi oluşturur. Ancak Visual Studio 2008'de ö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şikliği yaptıktan sonra tarayıcıda ziyaret edilen Login.aspx sayfası gösterilmektedir. Sol gezinti <div'inde> Default.aspx ziyaret ederken olduğu gibi "Merhaba, yabancı" veya "Geri hoş geldiniz, kullanıcı adı" iletisi olmadığını unutmayın.

Oturum Açma Sayfası Varsayılan LoginContent ContentPlaceHolder İşaretlemeyi Gizler

Şekil 17: Oturum Açma Sayfası Varsayılan LoginContent ContentPlaceHolder İşaretlemeyi Gizler (Tam boyutlu görüntüyü görüntülemek için tıklayın)

5. Adım: Oturumu Kapatma

3. Adımda, bir kullanıcının sitede oturum açmasını sağlamak için bir oturum açma sayfası oluşturmaya baktık, ancak kullanıcının oturumunu nasıl kapatacağımızı henüz görmedik. FormsAuthentication sınıfı, kullanıcının oturum açma yöntemlerine ek olarak bir SignOut yöntemi de sağlar. SignOut yöntemi, form kimlik doğrulama biletini yok eder ve böylece kullanıcının siteden çıkışını oluşturur.

Oturumu kapatma bağlantısı sunmak o kadar yaygın bir özelliktir ki ASP.NET kullanıcının oturumunuzu kapatması için özel olarak tasarlanmış bir denetim içerir. LoginStatus denetimi , kullanıcının kimlik doğrulaması durumuna bağlı olarak bir "Oturum Aç" LinkButton veya "Logout" LinkButton görüntüler. Anonim kullanıcılar için bir "Oturum Aç" LinkButton işlenirken, kimliği doğrulanmış kullanıcılara "Oturumu Kapat" LinkButton görüntülenir. "Login" ve "Logout" LinkButtons metinleri LoginStatus'un LoginText ve LogoutText özellikleri aracılığıyla yapılandırılabilir.

"Oturum Aç" BağlantıDüğmesinin tıklanması, yeniden yönlendirmenin oturum açma sayfasına verildiği bir geri göndermeye neden olur. "Oturumu Kapat" LinkButton'a tıklanması, LoginStatus denetiminin FormsAuthentication.SignOff yöntemini çağırmasına neden olur ve kullanıcıyı bir sayfaya yönlendirir. Oturumu kapatılan kullanıcının yeniden yönlendirildiği sayfa LogoutAction özelliğine bağlıdır ve bu özellik aşağıdaki üç değerden birine atanabilir:

  • Yenile – varsayılan; kullanıcıyı 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 bir yeniden yönlendirmenin neden gerçekleştirildiğini merak edebilirsiniz. Kullanıcı aynı sayfada kalmak istiyorsa, açık yeniden yönlendirmeye neden ihtiyaç duyulsun? Bunun nedeni, "Oturumu Kapat" LinkButton düğmesine tıklandığında kullanıcının tanımlama bilgileri koleksiyonunda form kimlik doğrulama biletinin hala 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 FormsAuthenticationModule kullanıcının kimliğini doğruladıktan sonra gerçekleşir. Bu nedenle, açık bir yeniden yönlendirme tarayıcının sayfayı yeniden istemesine neden olur. Tarayıcı sayfayı yeniden istediğinde Forms kimlik doğrulama bileti kaldırılmıştır ve bu nedenle gelen istek anonim olur.

  • Redirect: 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 kullanıcıyı oturumun 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. başlangıç olarak kök dizinde Logout.aspx adlı bir sayfa oluşturun. Bu sayfayı Site.master ana sayfasıyla ilişkilendirmeyi unutmayın. Ardından, sayfanın işaretlemesine kullanıcıya oturumu kapatıldığını açıklayan bir ileti girin.

Ardından, Site.master ana sayfasına dönün ve LoginContent ContentPlaceHolder'daki LoginView altına bir LoginStatus denetimi ekleyin. LoginStatus denetiminin LogoutAction özelliğini Redirect, LogoutPageUrl özelliğini ise "~/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 doğru bir "Oturum Açma" veya "Oturumu Kapat" LinkButton görüntüleyecek olduğundan bu sorun olmaz. LoginStatus denetiminin eklenmesiyle, AnonymousTemplate içindeki "Oturum Aç" Hiper Bağlantısı gereksizdir, bu nedenle kaldırın.

Şekil 18'de Jisun'un ziyaret Default.aspx gösterilmektedir. Sol sütunda oturumu kapatma bağlantısının yanı sıra "Hoş geldiniz Jisun" iletisinin görüntülendiğini unutmayın. Oturumu kapat LinkButton'a tıklanması bir geri göndermeye neden olur, Jisun'u sistemden çıkarır ve ardından Logout.aspx'e yönlendirir. Şekil 19'da gösterildiği gibi, Jisun Logout.aspx ulaştığında zaten oturumunu kapatmıştır ve bu nedenle anonimdir. Sonuç olarak, sol sütunda "Hoş geldiniz, yabancı" metni ve oturum açma sayfasının bağlantısı gösterilir.

Default.aspx Gösterileri

Şekil 18: Default.aspx "Geri Hoş Geldiniz, Jisun" ifadesinin yanı sıra "Oturumu Kapat" BağlantısıDüğmesini gösterir (tam boyutlu görüntüyü görüntülemek için tıklayın)

Logout.aspx Gösterir

Şekil 19: Logout.aspx "Hoş Geldiniz, yabancı" ifadesinin yanı sıra "Oturum Aç" Bağlantı Düğmesini gösterir (tam boyutlu görüntüyü görüntülemek için tıklayın)

Not

Ana sayfanın LoginContent ContentPlaceHolder'ını gizlemek için Logout.aspx sayfasını özelleştirmenizi öneririz (4. Adımda Login.aspx yaptığımız gibi). Bunun nedeni LoginStatus denetimi tarafından işlenen "Login" LinkButton 'ın ("Merhaba, yabancı" ifadesinin altındaki) kullanıcıyı, ReturnUrl querystring parametresindeki geçerli URL'yi geçirerek oturum açma sayfasına göndermesidir. Kısacası, oturumu kapatan bir kullanıcı bu LoginStatus'un "Login" LinkButton'ını tıklatır ve sonra oturum açarsa, kullanıcının kafasını karıştırabilecek şekilde Logout.aspx yeniden yönlendirilir.

Özet

Bu öğreticide form kimlik doğrulaması iş akışının incelenmesiyle başladık ve ardından ASP.NET bir uygulamada form kimlik doğrulamasını uygulamaya başladık. Forms kimlik doğrulaması, FormsAuthenticationModule tarafından desteklenir ve iki sorumluluk vardır: forms kimlik doğrulama biletine göre kullanıcıları tanımlama ve yetkisiz kullanıcıları oturum açma sayfasına yönlendirme.

.NET Framework 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 için ek programlama desteği ve kullanıcının kimliği hakkında bilgi 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 diğer oturum açma ile ilgili Web denetimlerini gelecek öğreticilerde daha ayrıntılı olarak inceleyeceğiz.

Bu öğreticide form kimlik doğrulamasına imleç bir genel bakış sağlanmıştır. Ç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 ASP.NET form kimlik doğrulama biletinin içeriğini nasıl koruyup korumadığını incelemedik.

Mutlu Programlama!

Daha Fazla Bilgi

Bu öğreticide ele alınan konular hakkında daha fazla bilgi için aşağıdaki kaynaklara bakın:

Bu Öğreticide Yer Alan Konularda 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ışmaktadır. Son kitabı Sams Teach Yourself ASP.NET 24 Hours 2.0'dır. Adresine adresinden veya adresinden ulaşabileceğiniz http://ScottOnWriting.NETblogu aracılığıyla ulaşabilirsinizmitchell@4GuysFromRolla.com.

Özel Teşekkürler...

Bu öğretici serisi birçok yararlı gözden geçiren tarafından gözden geçirildi. 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, bana adresinden bir satır mitchell@4GuysFromRolla.combırakın.