Kullanıcı Tabanlı Yetkilendirme (VB)

tarafından Scott Mitchell

Not

Bu makale yazıldığından beri, ASP.NET Üyelik 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 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 İndir

Bu öğreticide, çeşitli tekniklerle sayfalara erişimi sınırlamayı ve sayfa düzeyinde işlevselliği kısıtlamayı inceleyeceğiz.

Giriş

Kullanıcı hesapları sunan çoğu web uygulaması, bazı ziyaretçilerin site içindeki belirli sayfalara erişmesini kısıtlamak için kısmen bunu yapar. Çoğu çevrimiçi ileti panosu sitelerinde, örneğin anonim ve kimliği doğrulanmış tüm kullanıcılar ileti panosunun gönderilerini görüntüleyebilir, ancak yalnızca kimliği doğrulanmış kullanıcılar yeni bir gönderi oluşturmak için web sayfasını ziyaret edebilir. Ayrıca yalnızca belirli bir kullanıcı (veya belirli bir kullanıcı kümesi) tarafından erişilebilen yönetim sayfaları olabilir. Ayrıca, sayfa düzeyi işlevselliği kullanıcı bazında farklılık gösterebilir. Gönderi listesini görüntülerken kimliği doğrulanmış kullanıcılara her gönderiyi derecelendirmek için bir arabirim gösterilirken, bu arabirim anonim ziyaretçiler tarafından kullanılamaz.

ASP.NET, kullanıcı tabanlı yetkilendirme kurallarını tanımlamayı kolaylaştırır. içinde Web.configyalnızca biraz işaretleme ile, belirli web sayfaları veya tüm dizinler yalnızca belirli bir kullanıcı alt kümesi için erişilebilir olacak şekilde kilitlenebilir. Sayfa düzeyinde işlevsellik, programlı ve bildirim temelli yollarla şu anda oturum açmış olan kullanıcıya göre açılıp kapatılabilir.

Bu öğreticide, çeşitli tekniklerle sayfalara erişimi sınırlamayı ve sayfa düzeyinde işlevselliği kısıtlamayı inceleyeceğiz. Haydi başlayalım!

URL Yetkilendirme İş Akışına Bir Bakış

Form Kimlik Doğrulamasına Genel Bakış öğreticisinde açıklandığı gibi, ASP.NET çalışma zamanı bir ASP.NET kaynağı için bir isteği işlediğinde istek yaşam döngüsü boyunca bir dizi olay oluşturur. 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 gerçekleştiren bir dizi HTTP Modülü ile birlikte sağlanır.

Bu tür http modüllerinden biri şeklindedir FormsAuthenticationModule. Önceki öğreticilerde açıklandığı gibi, öğesinin FormsAuthenticationModule birincil işlevi geçerli isteğin kimliğini belirlemektir. Bu, bir tanımlama bilgisinde bulunan veya URL'nin içine eklenmiş form kimlik doğrulama bileti incelenerek gerçekleştirilir. Bu tanımlama olay sırasında AuthenticateRequestgerçekleşir.

Bir diğer önemli HTTP Modülü de UrlAuthorizationModuleolaya yanıt olarak AuthorizeRequest ortaya çıkan (olaydan sonra AuthenticateRequest gerçekleşen) modülüdür. , UrlAuthorizationModule geçerli kimliğin belirtilen sayfayı ziyaret etme yetkisine sahip olup olmadığını belirlemek için içindeki Web.config yapılandırma işaretlemesini inceler. Bu işlem URL yetkilendirmesi olarak adlandırılır.

1. Adımda URL yetkilendirme kurallarının söz dizimini inceleyeceğiz, ancak önce isteğin yetkilendirilip yetkilendirilmediğine bağlı olarak öğesinin ne UrlAuthorizationModule yaptığına bakalım. UrlAuthorizationModule isteğin yetkilendirildiğini belirlerse hiçbir şey yapmaz ve istek yaşam döngüsü boyunca devam eder. Ancak, istek yetkilendirilmediyse yaşam UrlAuthorizationModule döngüsünü durdurur ve nesneye HTTP 401 Yetkisiz durumu döndürmesini emrederResponse. Form kimlik doğrulaması kullanılırken, http 401 durumu algılanırsa http 302 Oturum açma sayfasına yönlendirme olarak değiştirildiğinden FormsAuthenticationModule bu HTTP 401 durumu hiçbir zaman istemciye döndürülemez.

Şekil 1'de ASP.NET işlem hattının iş akışı, FormsAuthenticationModuleve UrlAuthorizationModule yetkisiz istek geldiğinde gösterilmektedir. Şekil 1'de özellikle anonim bir ziyaretçi ProtectedPage.aspxtarafından yapılan ve anonim kullanıcılara erişimi engelleyen bir sayfa olan isteği gösterilmektedir. Ziyaretçi anonim olduğundan isteği UrlAuthorizationModule iptal eder ve HTTP 401 Yetkisiz durumunu döndürür. ardından FormsAuthenticationModule 401 durumunu 302 Oturum açma sayfasına yeniden yönlendirme sayfasına dönüştürür. Kullanıcının kimliği oturum açma sayfası aracılığıyla doğrulandıktan sonra adresine yönlendirilir ProtectedPage.aspx. Bu kez, FormsAuthenticationModule kimlik doğrulama biletine göre kullanıcıyı tanımlar. Ziyaretçinin kimliği doğrulandığından UrlAuthorizationModule , sayfaya erişim izni verir.

Forms Kimlik Doğrulaması ve URL Yetkilendirme İş Akışı

Şekil 1: Form Kimlik Doğrulaması ve URL Yetkilendirme İş Akışı (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Şekil 1'de anonim bir ziyaretçi anonim kullanıcılar tarafından kullanılamayan bir kaynağa erişmeye çalıştığında gerçekleşen etkileşim gösterilmektedir. Böyle bir durumda anonim ziyaretçi, sorgu dizesinde belirtilen ziyaret etmeye denediği sayfayla oturum açma sayfasına yönlendirilir. Kullanıcı başarıyla oturum açtıktan sonra, otomatik olarak görüntülemeye çalıştığı kaynağa yeniden yönlendirilir.

Yetkisiz istek anonim bir kullanıcı tarafından yapıldığında, bu iş akışı basittir ve ziyaretçinin ne olduğunu ve nedenini anlaması kolaydır. Ancak, istek kimliği doğrulanmış bir kullanıcı tarafından yapılmış olsa bile yetkisiz kullanıcıları oturum açma sayfasına yönlendireceğini unutmayınFormsAuthenticationModule. Kimliği doğrulanmış bir kullanıcı yetkisi olmayan bir sayfayı ziyaret etmeye çalışırsa, bu durum kafa karıştırıcı bir kullanıcı deneyimine neden olabilir.

Web sitemizin URL yetkilendirme kurallarının, ASP.NET sayfasının OnlyTito.aspx yalnızca Tito'ya erişebilecek şekilde yapılandırıldığını düşünün. Şimdi, Sam'in siteyi ziyaret ettiğini, oturum açtığını ve ardından adresini ziyaret OnlyTito.aspxetmeye çalışdığını düşünün. , UrlAuthorizationModule istek yaşam döngüsünü durdurur ve Sam'i algılayıp oturum açma sayfasına yönlendiren FormsAuthenticationModule BIR HTTP 401 Yetkisiz durumu döndürür. Sam zaten oturum açtığından, neden oturum açma sayfasına geri gönderildiğini merak edebilir. Oturum açma kimlik bilgilerinin bir şekilde kaybolmasına veya geçersiz kimlik bilgileri girmesine neden olabilir. Sam oturum açma sayfasından kimlik bilgilerini yeniden girse oturum açar (yeniden) ve adresine OnlyTito.aspxyönlendirilir. , Sam'in UrlAuthorizationModule bu sayfayı ziyaret edemeyeceğini algılar ve oturum açma sayfasına döndürülür.

Şekil 2'de bu kafa karıştırıcı iş akışı gösterilmektedir.

Varsayılan İş Akışı Kafa Karıştırıcı Bir Döngüye Yol Açabilir

Şekil 2: Varsayılan İş Akışı Kafa Karıştırıcı Bir Döngüye Yol Açabilir (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Şekil 2'de gösterilen iş akışı, en deneyimli bilgisayar ziyaretçisine bile hızlı bir şekilde karışabilir. 2. Adımda bu kafa karıştırıcı döngüyü önlemenin yollarını inceleyeceğiz.

Not

ASP.NET, geçerli kullanıcının belirli bir web sayfasına erişip erişemeyeceğini belirlemek için iki mekanizma kullanır: URL yetkilendirmesi ve dosya yetkilendirmesi. Dosya yetkilendirmesi, istenen dosya ACL'lerine başvurarak yetkiyi belirleyen tarafından uygulanır FileAuthorizationModule. ACL'ler Windows hesapları için geçerli olan izinler olduğundan, dosya yetkilendirmesi en yaygın olarak Windows kimlik doğrulamasıyla kullanılır. Form kimlik doğrulaması kullanılırken, siteyi ziyaret eden kullanıcıdan bağımsız olarak tüm işletim sistemi ve dosya sistemi düzeyindeki istekler aynı Windows hesabı tarafından yürütülür. Bu öğretici serisi form kimlik doğrulamasına odaklandığından, dosya yetkilendirmeyi tartışmayacağız.

URL Yetkilendirme kapsamı

UrlAuthorizationModule, 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 ASP. NET'ler UrlAuthorizationModule yalnızca iis'den ASP.NET çalışma zamanına bir istek temsilcisi atandığında yürütülür. Varsayılan olarak, IIS HTML sayfaları ve CSS, JavaScript ve görüntü dosyaları gibi statik içeriği işler ve yalnızca uzantısı , .asmxveya .ashx olan bir sayfa istendiğinde istekleri ASP.NET çalışma zamanına .aspxbırakır.

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 çağıracak UrlAuthorizationModule şekilde ayarlayabilirsiniz; başka bir deyişle, herhangi bir türdeki dosyalar için URL yetkilendirme kuralları tanımlanabilir. Buna ek olarak, IIS 7 kendi URL yetkilendirme altyapısını içerir. ASP.NET tümleştirmesi ve IIS 7'nin yerel URL yetkilendirme işlevselliği hakkında daha fazla bilgi için bkz. IIS7 URL Yetkilendirmesini Anlama. ASP.NET ve IIS 7 tümleştirmesine daha ayrıntılı bir bakış için, Shahram Khosravi'nin Professional IIS 7 ve ASP.NET Tümleşik Programlama (ISBN: 978-0470152539) kitabının bir kopyasını alın.

Özetle, IIS 7'den önceki sürümlerde URL yetkilendirme kuralları yalnızca ASP.NET çalışma zamanı tarafından işlenen kaynaklara uygulanır. Ancak IIS 7 ile IIS'nin yerel URL yetkilendirme özelliğini kullanmak veya ASP'yi tümleştirmek mümkündür. UrlAuthorizationModule NET, IIS'nin HTTP işlem hattına girer ve böylece bu işlevselliği tüm isteklere genişletir.

Not

ASP'nin yönteminde bazı küçük ama önemli farklılıklar vardır. NET'in UrlAuthorizationModule ve IIS 7'nin URL yetkilendirme özelliği yetkilendirme kurallarını işler. Bu öğretici, IIS 7'nin URL yetkilendirme işlevselliğini veya yetkilendirme kurallarının ile karşılaştırıldığında UrlAuthorizationModulenasıl ayrıştırdığı arasındaki farkları incelemez. Bu konular hakkında daha fazla bilgi için MSDN veya www.iis.net'daki IIS 7 belgelerine bakın.

1. Adım: url yetkilendirme kurallarını tanımlamaWeb.config

, UrlAuthorizationModule uygulamanın yapılandırmasında tanımlanan URL yetkilendirme kurallarına göre belirli bir kimlik için istenen kaynağa erişim izni verilip verilmeyeceğini belirler. Yetkilendirme kuralları öğesinde<authorization> ve <deny> alt öğeleri biçiminde <allow> yazılır. Her <allow> ve <deny> alt öğe şunları belirtebilir:

  • Belirli bir kullanıcı
  • Virgülle ayrılmış kullanıcı listesi
  • Soru işaretiyle (?) belirtilen tüm anonim kullanıcılar
  • Yıldız işareti (*) ile gösterilen tüm kullanıcılar

Aşağıdaki işaretlemede, Tito ve Scott kullanıcılarına izin vermek ve diğerlerini reddetmek için URL yetkilendirme kurallarının nasıl kullanılacağı gösterilmektedir:

<authorization>
 <allow users="Tito, Scott" />
 <deny users="*" />
</authorization>

<allow> öğesi, Tito ve Scott gibi kullanıcılara izin verilen kullanıcıları tanımlarken<deny>, öğe tüm kullanıcıların reddedildiğini ifade eder.

Not

<allow> ve <deny> öğeleri, roller için yetkilendirme kuralları da belirtebilir. Gelecek bir öğreticide rol tabanlı yetkilendirmeyi inceleyeceğiz.

Aşağıdaki ayar, Sam dışındaki herkese (anonim ziyaretçiler dahil) erişim verir:

<authorization>
 <deny users="Sam" />
</authorization>

Yalnızca kimliği doğrulanmış kullanıcılara izin vermek için, tüm anonim kullanıcılara erişimi reddeden aşağıdaki yapılandırmayı kullanın:

<authorization>
 <deny users="?" />
</authorization>

Yetkilendirme kuralları içindeki Web.config öğesi içinde <system.web> tanımlanır ve web uygulamasındaki tüm ASP.NET kaynaklarına uygulanır. Çoğu zaman, bir uygulamanın farklı bölümler için farklı yetkilendirme kuralları vardır. Örneğin, bir e-ticaret sitesinde tüm ziyaretçiler ürünleri inceler, ürün incelemelerini görebilir, katalogda arama yapabilir vb. Ancak yalnızca kimliği doğrulanmış kullanıcılar ödemeye veya gönderim geçmişini yönetmek için sayfalara ulaşabilir. Ayrıca, sitenin yalnızca site yöneticileri gibi belirli kullanıcılar tarafından erişilebilen bölümleri olabilir.

ASP.NET, sitedeki farklı dosya ve klasörler için farklı yetkilendirme kuralları tanımlamayı kolaylaştırır. Kök klasörün Web.config dosyasında belirtilen yetkilendirme kuralları sitedeki tüm ASP.NET kaynakları için geçerlidir. Ancak, bu varsayılan yetkilendirme ayarları bir bölümüyle eklenerek Web.config belirli bir <authorization> klasör için geçersiz kılınabilir.

Yalnızca kimliği doğrulanmış kullanıcıların klasördeki ASP.NET sayfalarını Membership ziyaret edebilmesi için web sitemizi güncelleştirelim. Bunu başarmak için klasöre bir Web.config dosya Membership eklememiz ve yetkilendirme ayarlarını anonim kullanıcıları reddedecek şekilde ayarlamamız gerekir. Çözüm Gezgini klasöre sağ tıklayınMembership, bağlam menüsünden Yeni Öğe Ekle menüsünü seçin ve adlı Web.configyeni bir Web Yapılandırma Dosyası ekleyin.

Üyelik Klasörüne Web.config Dosyası Ekleme

Şekil 3: Klasöre Membership Dosya Web.config Ekleme (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Bu noktada projeniz iki Web.config dosya içermelidir: biri kök dizinde, biri klasörde Membership .

Uygulamanız artık iki Web.config dosyası içermelidir

Şekil 4: Uygulamanız artık iki Web.config dosya içermelidir (tam boyutlu görüntüyü görüntülemek için tıklayın)

Klasördeki Membership yapılandırma dosyasını anonim kullanıcılara erişimi engelleyebilecek şekilde güncelleştirin.

<?xml version="1.0"?>
<configuration>
 <system.web>
 <authorization>
 <deny users="?" />
 </authorization>
 </system.web>
</configuration>

İşte bu kadar!

Bu değişikliği test etmek için tarayıcıda giriş sayfasını ziyaret edin ve oturumunuz açık olduğundan emin olun. bir ASP.NET uygulamasının varsayılan davranışı tüm ziyaretçilere izin vermek olduğundan ve kök dizinin dosyasında herhangi bir yetkilendirme değişikliği yapmadığımız için, kök dizindeki Web.config dosyaları anonim bir ziyaretçi olarak ziyaret edebiliyoruz.

Sol sütunda bulunan Kullanıcı Hesapları Oluştur bağlantısına tıklayın. Bu sizi adresine ~/Membership/CreatingUserAccounts.aspxgötürür. Web.config Klasördeki Membership dosya anonim erişimi yasaklayan yetkilendirme kurallarını tanımladığından isteği UrlAuthorizationModule durdurur ve HTTP 401 Yetkisiz durumu döndürür. bunu FormsAuthenticationModule 302 Yeniden Yönlendirme durumuna değiştirerek bizi oturum açma sayfasına gönderir. ErişmeyeCreatingUserAccounts.aspx () denediğimiz sayfanın querystring parametresi aracılığıyla ReturnUrl oturum açma sayfasına geçirildiğini unutmayın.

URL Yetkilendirme Kuralları Anonim Erişimi Yasakladığından Oturum Açma Sayfasına Yeniden Yönlendirildik

Şekil 5: URL Yetkilendirme Kuralları Anonim Erişimi Yasakladığından, Oturum Açma Sayfasına Yönlendiriliriz (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Başarıyla oturum açtıktan sonra sayfaya CreatingUserAccounts.aspx yönlendiriliriz. Artık anonim olmadığımız için bu kez UrlAuthorizationModule sayfaya erişim izni verir.

Belirli Bir Konuma URL Yetkilendirme Kuralları Uygulama

bölümünde Web.config tanımlanan <system.web> yetkilendirme ayarları, bu dizindeki ve alt dizinlerindeki tüm ASP.NET kaynakları için geçerlidir (başka bir Web.config dosya tarafından geçersiz kılınana kadar). Ancak bazı durumlarda, belirli bir dizindeki tüm ASP.NET kaynaklarının bir veya iki belirli sayfa dışında belirli bir yetkilendirme yapılandırmasına sahip olmasını isteyebiliriz. Bu, içinde Web.configbir <location> öğe ekleyerek, yetkilendirme kuralları farklı olan dosyaya işaret ederek ve burada benzersiz yetkilendirme kurallarını tanımlayarak elde edilebilir.

Öğesini kullanarak <location> belirli bir kaynağın yapılandırma ayarlarını geçersiz kılmayı göstermek için yetkilendirme ayarlarını yalnızca Tito'nun ziyaret CreatingUserAccounts.aspxedebilmesi için özelleştirelim. Bunu yapmak için klasörün Web.config dosyasına bir <location> öğe Membership ekleyin ve işaretlemesini aşağıdaki gibi görünecek şekilde güncelleştirin:

<?xml version="1.0"?>
<configuration>
 <system.web>
 <authorization>
 <deny users="?" />
 </authorization>
 </system.web>

 <location path="CreatingUserAccounts.aspx">
 <system.web>
 <authorization>
 <allow users="Tito" />
 <deny users="*" />
 </authorization>
 </system.web>
 </location>
</configuration>

<authorization> içindeki <system.web> öğesi, klasördeki ve alt klasörlerindeki Membership ASP.NET kaynaklar için varsayılan URL yetkilendirme kurallarını tanımlar. <location> öğesi, belirli bir kaynak için bu kuralları geçersiz kılmamıza olanak tanır. Yukarıdaki işaretlemede öğe sayfaya <location>CreatingUserAccounts.aspx başvurur ve Tito'ya izin vermek gibi yetkilendirme kurallarını belirtir, ancak diğer herkesi reddeder.

Bu yetkilendirme değişikliğini test etmek için, web sitesini anonim kullanıcı olarak ziyaret ederek başlayın. klasördeki Membership gibi UserBasedAuthorization.aspxUrlAuthorizationModule herhangi bir sayfayı ziyaret etmeye çalışırsanız, isteği reddeder ve oturum açma sayfasına yönlendirilirsiniz. Örneğin Scott olarak oturum açtıktan sonra klasördeki dışındaCreatingUserAccounts.aspxherhangi bir sayfayı Membership ziyaret edebilirsiniz. Tito dışında herhangi biri olarak oturum açmayı ziyaret CreatingUserAccounts.aspx etmek yetkisiz erişim girişimiyle sonuçlanır ve oturum açma sayfasına geri yönlendirilirsiniz.

Not

<location> öğesi yapılandırma <system.web> öğesinin dışında görünmelidir. Yetkilendirme ayarlarını geçersiz kılmak istediğiniz her kaynak için ayrı <location> bir öğe kullanmanız gerekir.

Erişim Vermek veya Reddetmek için Yetkilendirme Kurallarını NasılUrlAuthorizationModuleKullandığına Bir Bakış

, UrlAuthorizationModule URL yetkilendirme kurallarını tek tek analiz ederek, ilkinden başlayıp aşağı doğru çalışarak belirli bir URL için belirli bir kimliği yetkilendirmenin gerekip gerekmediğini belirler. Bir eşleşme bulunur bulunmaz, eşleştirmenin bir <allow> veya <deny> öğesinde bulunup bulunmadığına bağlı olarak kullanıcıya erişim izni verilir veya erişim reddedilir. Eşleşme bulunmazsa kullanıcıya erişim verilir. Sonuç olarak, erişimi kısıtlamak istiyorsanız, URL yetkilendirme yapılandırmasında son öğe olarak bir <deny> öğe kullanmanız zorunludur. Şunu atlarsanız:<deny>öğesinde, tüm kullanıcılara erişim verilir.

tarafından UrlAuthorizationModule yetkiliyi belirlemek için kullanılan işlemi daha iyi anlamak için, bu adımda daha önce incelediğimiz örnek URL yetkilendirme kurallarını göz önünde bulundurun. İlk kural, Tito ve Scott'a erişim sağlayan bir <allow> öğedir. İkinci kurallar, herkese erişimi engelleyen bir <deny> öğedir. Anonim bir kullanıcı ziyaret ederse, ilk olarak UrlAuthorizationModule "Scott mı yoksa Tito mu anonim?" sorusunu sorarak başlar. Cevap, açıkçası, Hayır, bu yüzden ikinci kurala devam eder. Herkesin dizisinde anonim mi? Buradaki yanıt Evet olduğundan kural <deny> geçerli olur ve ziyaretçi oturum açma sayfasına yönlendirilir. Benzer şekilde, Jisun ziyaret ediyorsa, UrlAuthorizationModule jisun ya Scott ya da Tito mu diye sorarak başlar. O olmadığı için, UrlAuthorizationModule ikinci soruya geçilir, Jisun herkesin setinde mi? O da erişimi reddedildi. Son olarak, Tito ziyaret ederse, tarafından sorulan UrlAuthorizationModule ilk soru olumlu bir yanıttır, bu nedenle Tito'ya erişim izni verilir.

UrlAuthorizationModule Yetkilendirme kurallarını yukarıdan aşağıya doğru işlediğinden, herhangi bir eşleşmede durduğundan, daha belirli kuralların daha az belirli kurallardan önce gelmesi önemlidir. Diğer bir deyişle, Jisun ve anonim kullanıcıları yasaklayan, ancak diğer tüm kimliği doğrulanmış kullanıcılara izin veren yetkilendirme kurallarını tanımlamak için, jisun'u etkileyen en özel kuralla başlarsınız ve ardından diğer tüm kimliği doğrulanmış kullanıcılara izin veren ancak tüm anonim kullanıcıları reddeden daha az belirli kurallara devam edebilirsiniz. Aşağıdaki URL yetkilendirme kuralları bu ilkeyi önce Jisun'u ve ardından anonim kullanıcıları reddederek uygular. Bu <deny> deyimlerden hiçbiri eşleşmeyeceğinden Jisun dışındaki kimliği doğrulanmış kullanıcılara erişim verilir.

<authorization>
 <deny users="Jisun" />
 <deny users="?" />
</authorization>

2. Adım: Yetkisiz, Kimliği Doğrulanmış Kullanıcılar için İş Akışını Düzeltme

Bu öğreticinin önceki bölümlerinde URL Yetkilendirme İş Akışına Göz Atın bölümünde ele aldığımız gibi, yetkisiz bir istek her geri geldiğinde istek UrlAuthorizationModule durdurulup HTTP 401 Yetkisiz durumu döndürülüyor. Bu 401 durumu, tarafından FormsAuthenticationModule kullanıcıyı oturum açma sayfasına gönderen bir 302 Yeniden Yönlendirme durumuna değiştirilir. Bu iş akışı, kullanıcının kimliği doğrulanmış olsa bile yetkisiz isteklerde gerçekleşir.

Kimliği doğrulanmış bir kullanıcıyı oturum açma sayfasına döndürmek, sistemde zaten oturum açtığından bu kullanıcının kafasını karıştırabilir. Biraz çalışmayla, yetkisiz isteklerde bulunan kimliği doğrulanmış kullanıcıları kısıtlı bir sayfaya erişmeye çalıştıklarını açıklayan bir sayfaya yönlendirerek bu iş akışını geliştirebiliriz.

Web uygulamasının kök klasöründe adlı UnauthorizedAccess.aspxyeni bir ASP.NET sayfası oluşturarak başlayın; bu sayfayı ana sayfayla ilişkilendirmeyi Site.master unutmayın. Bu sayfayı oluşturduktan sonra, ana sayfanın varsayılan içeriğinin LoginContent görüntülenmesi için ContentPlaceHolder'a başvuran İçerik denetimini kaldırın. Ardından, kullanıcının korumalı bir kaynağa erişmeyi denediğini belirten durumu açıklayan bir ileti ekleyin. Böyle bir ileti ekledikten sonra, UnauthorizedAccess.aspx sayfanın bildirim temelli işaretlemesi aşağıdakine benzer görünmelidir:

<%@ Page Language="VB" MasterPageFile="~/Site.master" AutoEventWireup="false"
CodeFile="UnauthorizedAccess.aspx.cs" Inherits="UnauthorizedAccess"
Title="Untitled Page" %>

<asp:Content ID="Content1" ContentPlaceHolderID="MainContent"
Runat="Server">
 <h2>Unauthorized Access</h2>
 <p>
 You have attempted to access a page that you are not authorized to view.
 </p>
 <p>
 If you have any questions, please contact the site administrator.
 </p>
</asp:Content>

Şimdi, kimliği doğrulanmış bir kullanıcı tarafından yetkisiz bir istek gerçekleştirilirse oturum açma sayfası yerine sayfaya gönderilmesi için UnauthorizedAccess.aspx iş akışını değiştirmemiz gerekiyor. Yetkisiz istekleri oturum açma sayfasına yeniden yönlendiren mantık, sınıfın FormsAuthenticationModule özel bir yöntemi içinde gömülüdür, bu nedenle bu davranışı özelleştiremiyoruz. Bununla birlikte, yapabileceğimiz, gerekirse kullanıcıyı UnauthorizedAccess.aspxadresine yönlendiren oturum açma sayfasına kendi mantığımızı eklemektir.

FormsAuthenticationModule Yetkisiz bir ziyaretçiyi oturum açma sayfasına yeniden yönlendirdiğinde, sorgu dizesine adıyla ReturnUrlistenen, yetkisiz URL'yi ekler. Örneğin, yetkisiz bir kullanıcı adresini ziyaret OnlyTito.aspxetmeye çalıştıysa, FormsAuthenticationModule bu kullanıcıyı adresine Login.aspx?ReturnUrl=OnlyTito.aspxyönlendirebilir. Bu nedenle, kimliği doğrulanmış bir kullanıcı tarafından oturum açma sayfasına parametresini içeren ReturnUrl bir querystring ile ulaşılırsa, kimliği doğrulanmamış bu kullanıcının görüntüleme yetkisi olmayan bir sayfayı ziyaret etmeye çalıştığını biliyoruz. Böyle bir durumda, onu adresine yönlendirmek UnauthorizedAccess.aspxistiyoruz.

Bunu yapmak için oturum açma sayfasının Page_Load olay işleyicisine aşağıdaki kodu ekleyin:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
 If Not Page.IsPostBack Then
 If Request.IsAuthenticated AndAlso Not String.IsNullOrEmpty(Request.QueryString("ReturnUrl")) Then
 ' This is an unauthorized, authenticated request...
 Response.Redirect("~/UnauthorizedAccess.aspx")
 End If
 End If
End Sub

Yukarıdaki kod kimliği doğrulanmış, yetkisiz kullanıcıları sayfaya UnauthorizedAccess.aspx yönlendirir. Bu mantığın nasıl çalıştığını görmek için siteyi anonim bir ziyaretçi olarak ziyaret edin ve sol sütundaki Kullanıcı Hesapları Oluştur bağlantısına tıklayın. Bu sizi ~/Membership/CreatingUserAccounts.aspx , 1. Adımda yalnızca Tito'ya erişime izin verecek şekilde yapılandırdığımız sayfaya götürür. Anonim kullanıcılar yasaklandığından FormsAuthenticationModule , bizi oturum açma sayfasına geri yönlendirir.

Bu noktada anonimiz, bu nedenle Request.IsAuthenticated döndürür False ve öğesine yönlendirilmedik UnauthorizedAccess.aspx. Bunun yerine oturum açma sayfası görüntülenir. Bruce gibi Tito dışında bir kullanıcı olarak oturum açın. Uygun kimlik bilgilerini girdikten sonra oturum açma sayfası bizi adresine geri ~/Membership/CreatingUserAccounts.aspxyönlendirir. Ancak, bu sayfaya yalnızca Tito tarafından erişilebildiği için, görüntüleme yetkimiz yok ve hemen oturum açma sayfasına geri dönüyoruz. Ancak Request.IsAuthenticated bu kez döndürür True (ve ReturnUrl querystring parametresi vardır), bu nedenle sayfaya UnauthorizedAccess.aspx yönlendiriliriz.

Kimliği Doğrulanmış, Yetkisiz Kullanıcılar UnauthorizedAccess.aspx'e Yeniden Yönlendiriliyor

Şekil 6: Kimliği doğrulanmış, Yetkisiz Kullanıcıların Yönlendirildiği UnauthorizedAccess.aspx Yer (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Bu özelleştirilmiş iş akışı, Şekil 2'de gösterilen döngüyü kısa devre yaparak daha mantıklı ve basit bir kullanıcı deneyimi sunar.

3. Adım: Şu Anda Oturum Açmış Olan Kullanıcıya Göre İşlevselliği Sınırlama

URL yetkilendirmesi, kaba yetkilendirme kurallarının belirtilmesine olanak sağlar. 1. Adımda gördüğümüz gibi, URL yetkilendirmesiyle hangi kimliklere izin verilir ve hangilerinin belirli bir sayfayı veya bir klasördeki tüm sayfaları görüntülemesi reddedilir? Ancak bazı senaryolarda, tüm kullanıcıların bir sayfayı ziyaret etmelerine izin vermek isteyebiliriz, ancak sayfa işlevselliğini ziyaret eden kullanıcıya göre sınırlandırabiliriz.

Kimliği doğrulanmış ziyaretçilerin ürünlerini gözden geçirmesine izin veren bir e-Ticaret web sitesi örneğini düşünün. Anonim bir kullanıcı bir ürünün sayfasını ziyaret ettiğinde yalnızca ürün bilgilerini görür ve gözden geçirme izni verilmez. Ancak, aynı sayfayı ziyaret eden kimliği doğrulanmış bir kullanıcı gözden geçirme arabirimini görebilir. Kimliği doğrulanmış kullanıcı bu ürünü henüz gözden geçirmemişse, arabirim bir gözden geçirme göndermesine olanak tanır; aksi takdirde, onlara daha önce gönderdikleri gözden geçirmeyi gösterir. Bu senaryoyu bir adım ileri götürmek için ürün sayfasında ek bilgiler gösterilip e-ticaret şirketinde çalışan kullanıcılar için genişletilmiş özellikler sunulabilir. Örneğin, ürün sayfası stoktaki envanteri listeleyip bir çalışan tarafından ziyaret edildiğinde ürünün fiyatını ve açıklamasını düzenleme seçeneklerini içerebilir.

Bu tür ayrıntılı yetkilendirme kuralları bildirim temelli veya programlı olarak (veya ikisinin bir bileşimi aracılığıyla) uygulanabilir. Sonraki bölümde LoginView denetimi aracılığıyla ayrıntılı yetkilendirmenin nasıl uygulanacağını göreceğiz. Bundan sonra programlama tekniklerini keşfedeceğiz. Bununla birlikte, ayrıntılı yetkilendirme kurallarını uygulamaya göz atabilmek için önce işlevselliği onu ziyaret eden kullanıcıya bağlı olan bir sayfa oluşturmamız gerekir.

Şimdi GridView içindeki belirli bir dizindeki dosyaları listeleyen bir sayfa oluşturalım. GridView, her dosyanın adını, boyutunu ve diğer bilgilerini listelemenin yanı sıra iki LinkButton sütunu içerir: biri Görünüm, diğeri de Delete başlıklı. Bağlantıyı GörüntüleDüğmesi'ne tıklanırsa, seçili dosyanın içeriği görüntülenir; Bağlantıyı SilDüğmesi tıklanırsa, dosya silinir. İlk olarak bu sayfayı, görüntüleme ve silme işlevlerinin tüm kullanıcılar tarafından kullanılabileceği şekilde oluşturalım. LoginView Denetimini Kullanma ve Program Aracılığıyla İşlevselliği Sınırlama bölümlerinde, sayfayı ziyaret eden kullanıcıya göre bu özelliklerin nasıl etkinleştirileceğini veya devre dışı bırakılacağını göreceğiz.

Not

Oluşturmak üzere olduğumuz ASP.NET sayfası, dosyaların listesini görüntülemek için bir GridView denetimi kullanır. Bu öğretici serisi form kimlik doğrulaması, yetkilendirme, kullanıcı hesapları ve rollere odaklandığından GridView denetiminin iç çalışmalarını tartışmak için çok fazla zaman harcamak istemiyorum. Bu öğretici, bu sayfayı ayarlamak için belirli adım adım yönergeler sağlarken, belirli seçimlerin neden yapıldığına veya belirli özelliklerin işlenen çıkış üzerindeki etkisine ilişkin ayrıntıları incelemez. GridView denetiminin kapsamlı bir incelemesi için ASP.NET 2.0 öğretici serisinde Verilerle Çalışma makaleme bakın.

dosyayı klasörde açarak UserBasedAuthorization.aspxMembership ve adlı FilesGridsayfaya bir GridView denetimi ekleyerek başlayın. GridView'un Akıllı Etiketi'nden Sütunları Düzenle bağlantısına tıklayarak Alanlar iletişim kutusunu başlatın. Buradan, sol alt köşedeki Alanları otomatik oluştur onay kutusunun işaretini kaldırın. Ardından, sol üst köşeden bir Seç düğmesi, Bir Sil düğmesi ve iki BoundField ekleyin (Seç ve Sil düğmeleri CommandField türünün altında bulunabilir). Seç düğmesinin SelectText özelliğini Görünüm olarak, ilk BoundField ve HeaderTextDataField özelliklerini ad olarak ayarlayın. İkinci BoundField özelliğini HeaderText Bayt cinsinden Boyut, DataField özelliğini Length, DataFormatString özelliğini {0:N0} olarak ve HtmlEncode özelliğini False olarak ayarlayın.

GridView sütunlarını yapılandırdıktan sonra Alanlar iletişim kutusunu kapatmak için Tamam'a tıklayın. Özellikler penceresi GridView özelliğini DataKeyNames olarak FullNameayarlayın. Bu noktada GridView'un bildirim temelli işaretlemesi aşağıdaki gibi görünmelidir:

<asp:GridView ID="FilesGrid" DataKeyNames="FullName" runat="server" AutoGenerateColumns="False">
 <Columns>
 <asp:CommandField SelectText="View" ShowSelectButton="True"/>
 <asp:CommandField ShowDeleteButton="True" />
 <asp:BoundField DataField="Name" HeaderText="Name" />
 <asp:BoundField DataField="Length" DataFormatString="{0:N0}"
 HeaderText="Size in Bytes" HtmlEncode="False" />
 </Columns>
</asp:GridView>

GridView'un işaretlemesi oluşturulduktan sonra, belirli bir dizindeki dosyaları alacak ve GridView'a bağlayacak kodu yazmaya hazırız. Sayfanın Page_Load olay işleyicisine aşağıdaki kodu ekleyin:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
 If Not Page.IsPostBack Then
 Dim appPath As String = Request.PhysicalApplicationPath
 Dim dirInfo As New DirectoryInfo(appPath)

 Dim files() As FileInfo = dirInfo.GetFiles()

 FilesGrid.DataSource = files
 FilesGrid.DataBind()
 End If
End Sub

Yukarıdaki kod, uygulamanın kök klasöründeki dosyaların listesini almak için sınıfını kullanırDirectoryInfo. GetFiles() yöntemi, dizindeki tüm dosyaları daha sonra GridView'a bağlı olan bir nesne dizisi FileInfoolarak döndürür. Nesne, FileInfo , ve IsReadOnlygibi NameLengthözelliklere sahiptir. Bildirim temelli işaretlemesinden görebileceğiniz gibi GridView yalnızca Name ve Length özelliklerini görüntüler.

Not

DirectoryInfo ve FileInfo sınıfları ad alanında System.IObulunur. Bu nedenle, bu sınıf adlarını ad alanı ad alanlarıyla başlatmanız veya ad alanını sınıf dosyasına (aracılığıyla Imports System.IO) içeri aktarmanız gerekir.

Bir tarayıcı üzerinden bu sayfayı ziyaret etmek için biraz zaman ayırın. Uygulamanın kök dizininde bulunan dosyaların listesini görüntüler. LinkButton'ları Görüntüle veya Sil'e tıklanması geri göndermeye neden olur, ancak gerekli olay işleyicilerini henüz oluşturmadığımız için hiçbir eylem gerçekleşmez.

GridView, Web Uygulamasının Kök Dizinindeki Dosyaları Listeler

Şekil 7: GridView, Web Uygulamasının Kök Dizinindeki Dosyaları Listeler (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Seçili dosyanın içeriğini görüntülemek için bir araç gerekir. Visual Studio'ya dönün ve GridView'un üzerine adlı FileContents bir TextBox ekleyin. TextMode özelliğini MultiLine ve ColumnsRows özelliklerini sırasıyla %95 ve 10 olarak ayarlayın.

<asp:TextBox ID="FileContents" runat="server" Rows="10"
TextMode="MultiLine" Width="95%"></asp:TextBox>

Ardından GridView SelectedIndexChanged olayı için bir olay işleyicisi oluşturun ve aşağıdaki kodu ekleyin:

Protected Sub FilesGrid_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles FilesGrid.SelectedIndexChanged
 ' Open the file and display it
 Dim fullFileName As String = FilesGrid.SelectedValue.ToString()
 Dim contents As String = File.ReadAllText(fullFileName)
 FileContents.Text = contents
End Sub

Bu kod, seçili dosyanın tam dosya adını belirlemek için GridView SelectedValue özelliğini kullanır. İç olarak, DataKeys koleksiyonu elde etmek için SelectedValuebaşvurulur, bu nedenle GridView özelliğini DataKeyNames bu adımda daha önce açıklandığı gibi Name olarak ayarlamanız zorunludur. File sınıfı, seçili dosyanın içeriğini bir dizede okumak için kullanılır. Bu dize daha sonra TextBox'ın Text özelliğine FileContents atanır ve böylece seçili dosyanın içeriği sayfada görüntülenir.

Seçili Dosyanın İçeriği TextBox'ta Görüntülenir

Şekil 8: Seçili Dosyanın İçeriği Metin Kutusu'nda Görüntülenir (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Not

HTML işaretlemesi içeren bir dosyanın içeriğini görüntüler ve sonra bir dosyayı görüntülemeye veya silmeye çalışırsanız, bir HttpRequestValidationException hata alırsınız. Bunun nedeni, geri gönderme sırasında TextBox içeriğinin web sunucusuna geri gönderilmesidir. Varsayılan olarak, HTML işaretlemesi gibi tehlikeli olabilecek geri gönderme içeriği algılandığında ASP.NET bir HttpRequestValidationException hata oluşturur. Bu hatanın oluşmasını devre dışı bırakmak için yönergesine ekleyerek ValidateRequest="false" sayfa için istek doğrulamasını @Page kapatın. İstek doğrulamanın avantajları ve devre dışı bırakırken almanız gereken önlemler hakkında daha fazla bilgi için İstek Doğrulama - Betik Saldırılarını Önleme bölümüne bakın.

Son olarak, GridView'un RowDeleting olayı için aşağıdaki kodu içeren bir olay işleyicisi ekleyin:

Protected Sub FilesGrid_RowDeleting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewDeleteEventArgs)Handles FilesGrid.RowDeleting
 Dim fullFileName As String = FilesGrid.DataKeys(e.RowIndex).Value.ToString()
 FileContents.Text = String.Format("You have opted to delete {0}.", fullFileName)

 ' To actually delete the file, uncomment the following line
 ' File.Delete(fullFileName)
End Sub

Kod, dosyayı gerçekten silmeden TextBox'ta FileContents silinecek dosyanın tam adını görüntüler.

Sil düğmesine tıklanması Aslında Dosyayı Silmez

Şekil 9: Sil Düğmesine Tıkladığınızda Dosya Aslında Silinmez (Tam boyutlu görüntüyü görüntülemek için tıklayın)

1. Adımda, anonim kullanıcıların klasördeki sayfaları Membership görüntülemesini yasaklama amacıyla URL yetkilendirme kurallarını yapılandırdık. Ayrıntılı kimlik doğrulamasını daha iyi sergilemek için, anonim kullanıcıların sayfayı UserBasedAuthorization.aspx ziyaret etmesine izin verelim, ancak sınırlı işlevsellikle. Bu sayfayı tüm kullanıcılar tarafından erişilecek şekilde açmak için klasördeki dosyaya Web.config aşağıdaki <location> öğeyi Membership ekleyin:

<location path="UserBasedAuthorization.aspx">
 <system.web>
 <authorization>
 <allow users="*" />
 </authorization>
 </system.web>
</location>

Bu <location> öğeyi ekledikten sonra, sitenin oturumunu kapatarak yeni URL yetkilendirme kurallarını test edin. Anonim bir kullanıcı olarak sayfayı ziyaret UserBasedAuthorization.aspx etme iznine sahip olmanız gerekir.

Şu anda kimliği doğrulanmış veya anonim kullanıcılar sayfayı UserBasedAuthorization.aspx ziyaret edebilir ve dosyaları görüntüleyebilir veya silebilir. Bunu, yalnızca kimliği doğrulanmış kullanıcıların bir dosyanın içeriğini görüntüleyebilmesini ve yalnızca Tito'nun bir dosyayı silebilmesini sağlayacağız. Bu tür ayrıntılı yetkilendirme kuralları bildirim temelli, programlı olarak veya her iki yöntemin birleşimiyle uygulanabilir. Bir dosyanın içeriğini kimlerin görüntüleyebileceğini sınırlamak için bildirim temelli yaklaşımı kullanalım; bir dosyayı kimlerin silebileceğini sınırlamak için programlama yaklaşımını kullanacağız.

LoginView Denetimini Kullanma

Geçmiş öğreticilerde gördüğümüz gibi LoginView denetimi, kimliği doğrulanmış ve anonim kullanıcılar için farklı arabirimleri görüntülemek için kullanışlıdır ve anonim kullanıcılar tarafından erişilmeyen işlevleri gizlemenin kolay bir yolunu sunar. Anonim kullanıcılar dosyaları görüntüleyemediğinden veya silemediğinden, yalnızca sayfa kimliği doğrulanmış bir kullanıcı tarafından ziyaret edildiğinde TextBox'ı göstermemiz FileContents gerekir. Bunu başarmak için sayfaya bir LoginView denetimi ekleyin, adını verin LoginViewForFileContentsTextBoxve TextBox'ın bildirim temelli işaretlemesini LoginView denetiminin LoggedInTemplateiçine taşıyınFileContents.

<asp:LoginView ID=" LoginViewForFileContentsTextBox " runat="server">
 <LoggedInTemplate>
 <p>
 <asp:TextBox ID="FileContents" runat="server" Rows="10"
 TextMode="MultiLine" Width="95%"></asp:TextBox>
 </p>
 </LoggedInTemplate>
</asp:LoginView>

LoginView şablonlarındaki Web denetimlerine artık arka planda kod sınıfından doğrudan erişilemez. Örneğin, FilesGrid GridView'un SelectedIndexChanged ve RowDeleting olay işleyicileri şu anda TextBox denetimine FileContents şu kodla başvurur:

FileContents.Text = text

Ancak, bu kod artık geçerli değildir. TextBox'ın FileContents TextBox'a taşınmasıyla LoggedInTemplate doğrudan erişilemez. Bunun yerine, denetime FindControl("controlId") program aracılığıyla başvurmak için yöntemini kullanmalıyız. FilesGrid Olay işleyicilerini TextBox'a başvuracak şekilde güncelleştirin:

Dim FileContentsTextBox As TextBox = CType(LoginViewForFileContentsTextBox.FindControl("FileContents"),TextBox)
FileContentsTextBox.Text = text

TextBox'ı LoginView'a LoggedInTemplate taşıdıktan ve deseni kullanarak FindControl("controlId") TextBox'a başvurmak için sayfanın kodunu güncelleştirdikten sonra, sayfayı anonim kullanıcı olarak ziyaret edin. Şekil 10'da gösterildiği gibi TextBox FileContents görüntülenmez. Ancak, Bağlantıyı GörüntüleDüğmesi görüntülenmeye devam ediyor.

LoginView Denetimi Yalnızca Kimliği Doğrulanmış Kullanıcılar için FileContents TextBox İşler

Şekil 10: LoginView Denetimi, TextBox'ı Yalnızca Kimliği Doğrulanmış Kullanıcılar için İşler FileContents (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Anonim kullanıcılar için Görünüm düğmesini gizlemenin bir yolu, GridView alanını TemplateField'e dönüştürmektir. Bu, BağlantıDüğmesini Görüntüle için bildirim temelli işaretlemeyi içeren bir şablon oluşturur. Daha sonra TemplateField'e bir LoginView denetimi ekleyebilir ve LinkButton'ı LoginView'ın LoggedInTemplateiçine yerleştirerek Görünüm düğmesini anonim ziyaretçilerden gizleyebiliriz. Bunu yapmak için GridView'un Akıllı Etiketindeki Sütunları Düzenle bağlantısına tıklayarak Alanlar iletişim kutusunu başlatın. Ardından, sol alt köşedeki listeden Seç düğmesini seçin ve ardından Bu alanı TemplateField'e dönüştür bağlantısına tıklayın. Bunu yaptığınızda, alanın bildirim temelli işaretlemesi şu şekilde değiştirilir:

<asp:CommandField SelectText="View" ShowSelectButton="True"/>

Hedef:

<asp:TemplateField ShowHeader="False">
 <ItemTemplate>
 <asp:LinkButton ID="LinkButton1" runat="server" CausesValidation="False"
 CommandName="Select" Text="View"></asp:LinkButton>
 </ItemTemplate>
</asp:TemplateField>

Bu noktada TemplateField'e bir LoginView ekleyebiliriz. Aşağıdaki işaretleme yalnızca kimliği doğrulanmış kullanıcılar için LinkButton'i Görüntüle'yi görüntüler.

<asp:TemplateField ShowHeader="False">
 <ItemTemplate>
 <asp:LoginView ID="LoginView1" runat="server">
 <LoggedInTemplate>
 <asp:LinkButton ID="LinkButton1" runat="server" CausesValidation="False"
 CommandName="Select" Text="View"></asp:LinkButton>
 </LoggedInTemplate>
 </asp:LoginView>
 </ItemTemplate>
</asp:TemplateField>

Şekil 11'de gösterildiği gibi, sütundaki View LinkButtons gizlense bile Görünüm sütunu hala görüntülendiğinden sonuç o kadar da güzel değildir. Sonraki bölümde GridView sütununun tamamının (yalnızca LinkButton değil) nasıl gizleneceğini inceleyeceğiz.

LoginView Denetimi Anonim Ziyaretçiler için Görünüm LinkButton'larını Gizler

Şekil 11: LoginView Denetimi Anonim Ziyaretçiler için Bağlantıyı GörüntüleDüğmesini Gizler (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Program Aracılığıyla İşlevselliği Sınırlama

Bazı durumlarda bildirim temelli teknikler, işlevselliği bir sayfayla sınırlamak için yetersizdir. Örneğin, belirli sayfa işlevlerinin kullanılabilirliği, sayfayı ziyaret eden kullanıcının anonim veya kimlik doğrulamasından öte ölçütlere bağlı olabilir. Bu gibi durumlarda, çeşitli kullanıcı arabirimi öğeleri programlı yollarla görüntülenebilir veya gizlenebilir.

İşlevselliği program aracılığıyla sınırlamak için iki görev gerçekleştirmemiz gerekir:

  1. Sayfayı ziyaret eden kullanıcının işlevlere erişip erişemeyeceğini belirleyin ve
  2. Kullanıcının söz konusu işleve erişimi olup olmadığına bağlı olarak kullanıcı arabirimini program aracılığıyla değiştirin.

Bu iki görevi uygulamayı göstermek için Tito'nun yalnızca GridView'dan dosya silmesine izin verelim. O zaman ilk görevimiz, sayfayı ziyaret eden Tito olup olmadığını belirlemektir. Bu belirlendikten sonra GridView'un Delete sütununu gizlememiz (veya göstermemiz) gerekir. GridView'un sütunlarına Columns özelliği aracılığıyla erişilebilir; bir sütun yalnızca özelliği (varsayılan) olarak ayarlandığında True işlenirVisible.

Verileri GridView'a Page_Load bağlamadan önce olay işleyicisine aşağıdaki kodu ekleyin:

' Is this Tito visiting the page?
Dim userName As String = User.Identity.Name
If String.Compare(userName, "Tito", True) = 0 Then
 ' This is Tito, SHOW the Delete column
 FilesGrid.Columns(1).Visible = True
Else
 ' This is NOT Tito, HIDE the Delete column
 FilesGrid.Columns(1).Visible = False
End If

Form Kimlik Doğrulamasına Genel Bakış öğreticisinde ele aldığımız gibi, User.Identity.Name kimliğin adını döndürür. Bu, Oturum açma denetimine girilen kullanıcı adıyla eşleşmektedir. Sayfayı ziyaret eden Tito ise GridView'un ikinci sütununun Visible özelliği olarak ayarlanır True; aksi takdirde olarak ayarlanır False. Net sonuç, Tito dışında biri sayfayı ziyaret ettiğinde( başka bir kimliği doğrulanmış kullanıcı veya anonim bir kullanıcı), Delete sütununun işlenmemesidir (bkz. Şekil 12); ancak, Tito sayfayı ziyaret ettiğinde Delete sütunu vardır (bkz. Şekil 13).

Sil sütunu, Tito dışında biri (Bruce gibi) tarafından ziyaret edildiğinde işlenmez

Şekil 12: Silme Sütunu, Tito Dışında Biri (Bruce gibi) Tarafından Ziyaret Edildiğinde İşlenmez (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Silme Sütunu Tito için İşlendi

Şekil 13: Sütun Sil Tito için İşlendi (Tam boyutlu görüntüyü görüntülemek için tıklayın)

4. Adım: Sınıflara ve Yöntemlere Yetkilendirme Kuralları Uygulama

3. Adımda anonim kullanıcıların bir dosyanın içeriğini görüntülemelerine izin vermedik ve Tito dışında tüm kullanıcıların dosyaları silmesini yasakladık. Bu, yetkisiz ziyaretçiler için ilişkili kullanıcı arabirimi öğelerini bildirim temelli ve programlı tekniklerle gizleyerek gerçekleştirilir. Basit örneğimizde, kullanıcı arabirimi öğelerini düzgün bir şekilde gizlemek kolaydı, ancak aynı işlevselliği gerçekleştirmenin birçok farklı yolunun bulunabileceği daha karmaşık sitelere ne olacak? Bu işlevi yetkisiz kullanıcılarla sınırlandırırken, tüm geçerli kullanıcı arabirimi öğelerini gizlemeyi veya devre dışı bırakmayı unutursak ne olur?

Belirli bir işlev parçasına yetkisiz bir kullanıcı tarafından erişilememesini sağlamanın kolay bir yolu, bu sınıfı veya yöntemi özniteliğiylePrincipalPermission süslemektir. .NET çalışma zamanı bir sınıf kullandığında veya yöntemlerinden birini yürüttüğünde, geçerli güvenlik bağlamının sınıfı kullanma veya yöntemini yürütme izni olduğundan emin olmak için denetler. PrincipalPermission özniteliği, bu kuralları tanımlayabildiğimiz bir mekanizma sağlar.

Şimdi sırasıyla anonim kullanıcılar ve Tito dışındaki kullanıcılar tarafından yürütülmesini yasaklama amacıyla GridView SelectedIndexChanged ve RowDeleting olay işleyicilerinde özniteliğini kullanmayı PrincipalPermission gösterelim. Tek yapmamız gereken her işlev tanımının üzerine uygun özniteliği eklemektir:

<PrincipalPermission(SecurityAction.Demand, Authenticated:=True)> _
Protected Sub FilesGrid_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles FilesGrid.SelectedIndexChanged
 ...
End Sub

<PrincipalPermission(SecurityAction.Demand, Name:="Tito")> _
Protected Sub FilesGrid_RowDeleting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewDeleteEventArgs) Handles FilesGrid.RowDeleting
 ...
End Sub

Olay işleyicisinin SelectedIndexChanged özniteliği, yalnızca kimliği doğrulanmış kullanıcıların olay işleyicisini yürütebileceğini belirtir ve burada olay işleyicideki RowDeleting özniteliği yürütmeyi Tito ile sınırlar.

Not

Öznitelik bir sınıfa, yönteme, özelliğe veya olaya uygulanabilir. Öznitelik eklerken sınıfın, yöntemin, özelliğin veya olay bildirimi deyiminin bir parçası olması gerekir. Visual Basic satır sonlarını deyim sınırlayıcıları olarak kullandığından, özniteliklerin bildirimle aynı satırda veya doğrudan üstünde bir satır devamlılığı karakteriyle (alt çizgi) görünmesi gerekir. Yukarıdaki kod parçacığında, özniteliği bir satıra, yöntem bildirimini başka bir satıra yerleştirmek için satır devamlılığı karakteri kullanılır.

Bir şekilde, Tito dışındaki bir kullanıcı olay işleyicisini RowDeleting yürütmeye çalışırsa veya kimliği doğrulanmamış bir kullanıcı olay işleyicisini yürütmeye SelectedIndexChanged çalışırsa, .NET çalışma zamanı bir SecurityExceptionoluşturur.

Güvenlik Bağlamı Yöntemi Yürütme yetkisine sahip değilse SecurityException Oluşturulur

Şekil 14: Güvenlik Bağlamı Yöntemi Yürütme yetkisine sahip değilse, bir SecurityException Oluşturulur (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Not

Birden çok güvenlik bağlamlarının bir sınıfa veya yönteme erişmesine izin vermek için, sınıfı veya yöntemi her güvenlik bağlamı için bir PrincipalPermission öznitelikle süsleyin. Yani, hem Tito hem de Bruce'un olay işleyicisini RowDeleting yürütmesine izin vermek için ikiPrincipalPermission öznitelik ekleyin:

<PrincipalPermission(SecurityAction.Demand, Name:="Tito")> _

<PrincipalPermission(SecurityAction.Demand, Name:="Bruce")> _

ASP.NET sayfalara ek olarak, birçok uygulamanın İş Mantığı ve Veri Erişim Katmanları gibi çeşitli katmanları içeren bir mimarisi de vardır. Bu katmanlar genellikle Sınıf Kitaplıkları olarak uygulanır ve iş mantığı ve verilerle ilgili işlevleri gerçekleştirmek için sınıflar ve yöntemler sunar. PrincipalPermission özniteliği, bu katmanlara yetkilendirme kuralları uygulamak için kullanışlıdır.

Sınıflar ve yöntemler üzerinde yetkilendirme kuralları tanımlamak için özniteliğini PrincipalPermission kullanma hakkında daha fazla bilgi için Scott Guthrie'ninkullanarak İş ve Veri Katmanlarına PrincipalPermissionAttributesYetkilendirme Kuralları Ekleme blog girdisine bakın.

Özet

Bu öğreticide kullanıcı tabanlı yetkilendirme kurallarının nasıl uygulanacağını inceledik. ASP'ye bir göz atarak başladık. NET'in URL yetkilendirme çerçevesi. her istekte, ASP.NET altyapısının UrlAuthorizationModule kimliğin istenen kaynağa erişme yetkisi olup olmadığını belirlemek için uygulamanın yapılandırmasında tanımlanan URL yetkilendirme kurallarını inceler. Kısacası, URL yetkilendirmesi belirli bir sayfa veya belirli bir dizindeki tüm sayfalar için yetkilendirme kuralları belirtmeyi kolaylaştırır.

URL yetkilendirme çerçevesi, yetkilendirme kurallarını sayfa sayfa uygular. URL yetkilendirmesi ile, istekte bulunan kimliğin belirli bir kaynağa erişme yetkisi vardır veya değildir. Ancak birçok senaryo daha ayrıntılı yetkilendirme kuralları gerektirir. Sayfaya kimlerin erişmesine izin verilip verilmeyeceğini tanımlamak yerine, herkesin sayfaya erişmesine izin vermemiz, ancak sayfayı ziyaret eden kullanıcıya bağlı olarak farklı veriler göstermemiz veya farklı işlevler sunmamız gerekebilir. Sayfa düzeyinde yetkilendirme, yetkisiz kullanıcıların yasaklanmış işlevlere erişmesini önlemek için genellikle belirli kullanıcı arabirimi öğelerini gizlemeyi içerir. Ayrıca, belirli kullanıcılar için sınıflara erişimi ve yöntemlerinin yürütülmesini kısıtlamak için öznitelikleri kullanmak mümkündür.

Mutlu Programlama!

Daha Fazla Bilgi

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

Yazar hakkında

Birden çok ASP/ASP.NET kitabının yazarı ve 4GuysFromRolla.com kurucusu Scott Mitchell, 1998'den beri Microsoft Web teknolojileriyle çalışmaktadır. Scott bağımsız bir danışman, eğitmen ve yazar olarak çalışmaktadır. Son kitabı Sams Teach Yourself ASP.NET 24 Hours 2.0'dır. Scott'a adresinden mitchell@4guysfromrolla.com veya adresinden blogundan http://ScottOnWriting.NETulaşabilirsiniz.

Özel Teşekkürler

Bu öğretici serisi birçok yararlı gözden geçiren tarafından gözden geçirildi. Yaklaşan MSDN makalelerimi gözden geçirmek istiyor musunuz? Öyleyse, bana adresinden bir satır mitchell@4GuysFromRolla.combırakın.