ASP .NET Destek Ses Sütunu

Form Kimlik Doğrulaması Sorunlarını Giderme

ASP.NET Destek Sesi sütununa hoş geldiniz! Adım Jerry Orman. Microsoft ile 5 yıldan uzun süredir birlikteyim ve zamanımın çoğunu Microsoft FrontPage ve yeni Microsoft SharePoint teknolojileri gibi Web ile ilgili teknolojilere odaklanarak geçirdim. Geçen yılı Microsoft ASP.NET destek mühendisi olarak çalışarak geçirdim. Bu ay Destek Sesi sütununda, Microsoft ASP.NET'de Form Kimlik Doğrulaması sorunlarının nasıl gidereceğini açıklayacağım.

Form Kimlik Doğrulaması Sorunlarını Giderme

ASP.NET bir uygulamada Form Kimlik Doğrulaması kullandığınızda, kullanıcı rastgele oturum açma sayfasına yeniden yönlendirildiğinde oluşan bir sorunu gidermeniz gerekebilir. İdeal bir dünyada, bu sorun kolayca bir hata ayıklayıcı eklemenize ve sorunu yakalamanıza olanak verecek şekilde ortaya çıkar. Ancak üretim ortamlarında bu durum nadiren görülür. Bunun gibi rastgele bir sorunu gidermek için, kök nedeni daraltabilmek için sorunla ilgili bilgileri günlüğe kaydetmeniz gerekir.Bu sütunda, Forms Kimlik Doğrulaması kavramını kısaca ele alacağız. Ardından kullanıcının oturum açma sayfasına yönlendirilmesini sağlayan senaryoları ve sorunu yalıtmak için uygun verileri nasıl yakalayacağını inceleyeceğiz. Ayrıca, Form Kimlik Doğrulaması bilgilerini günlüğe kaydetmek için IHttpModule arabiriminin nasıl uygulanıyor olduğunu da ele alacağız.

Forms Kimlik Doğrulamasına Genel Bakış

Bir kullanıcı Forms Kimlik Doğrulaması'nı kullanarak bir Web sitesinde kimlik doğrulaması gerçekleştirdiğinde, sunucu bir tanımlama bilgisi oluşturur. Tanımlama bilgisinin değeri şifrelenmiş form kimlik doğrulama biletidir. Tanımlama bilgisi uygulamaya yapılan her istekte sunucuya geçirilir ve FormsAuthenticationModule sınıfı tanımlama bilgisi değerinin şifresini çözer ve kullanıcının geçerli olup olmadığını belirler.Varsayılan olarak, FormsAuthenticationModule sınıfı Machine.config dosyasına eklenir. FormsAuthenticationModule sınıfı, FormsAuthentication işlemini yönetir.Aşağıdaki, Machine.config dosyasından bir girdidir:

<httpModule>
     …other modules…
     <add name="FormsAuthentication"
         type="System.Web.Security.FormsAuthenticationModule" />
     …other modules…
</httpModule>

Forms Kimlik Doğrulaması kullanılarak kimlik doğrulaması için genel HTTP trafiği aşağıdakine benzer:

  1. İstemci, Default.aspx'e bir HTTP GET gönderir. Form kimlik doğrulaması tanımlama bilgisi gönderilmez.

  2. Sunucu Login.aspx'e bir 302 yanıtı (yeniden yönlendirme) gönderir.

  3. İstemci Login.aspx'e bir HTTP POST gönderir. Oturum açma bilgilerini içerir.

  4. Sunucu Default.aspx'e bir 302 yanıtı (yeniden yönlendirme) gönderir. Form kimlik doğrulama tanımlama bilgisi dahil edilir.

  5. İstemci, Default.aspx'e bir HTTP GET gönderir. Bu form kimlik doğrulama tanımlama bilgisini içerir.

Form kimlik doğrulamasını uygulama ve kullanma hakkında daha fazla bilgi için aşağıdaki MSDN Web sitelerini ziyaret edin:

http://msdn2.microsoft.com/en-us/library/7t6b43z4.aspx

http://msdn2.microsoft.com/en-us/library/system.web.security.formsauthentication(vs.71).aspx

http://msdn2.microsoft.com/en-us/library/system.web.security.formsauthenticationticket(vs.71).aspxForm kimlik doğrulama tanımlama bilgilerini paylaşma hakkında daha fazla bilgi için aşağıdaki ASP.NET Web sitesini ziyaret edin:

http://quickstarts.asp.net/QuickStartv20/aspnet/doc/security/formsauth.aspx

Kullanıcının oturum açma sayfasına yönlendirilebileceği nedenler

Form kimlik doğrulaması tanımlama bilgisi kaybolur

Senaryo 1

Bu senaryoda, bir kullanıcı Web sitesinde oturum açar. Bir noktada istemci sunucuya bir istek gönderir ve FormsAuthenticationModule sınıfı tanımlama bilgisini almaz. Microsoft Internet Information Services (IIS) içinde tanımlama bilgisi günlüğünü etkinleştirerek bir kullanıcı isteğinin tanımlama bilgisini içerip içermediğini belirleyebilirsiniz. Bunu yapmak için şu adımları uygulayın:

  1. IIS Microsoft Yönetim Konsolu'nu (MMC) açın.

  2. Web sitesine sağ tıklayın ve ardındanÖzellikler'e tıklayın.

  3. Web Sitesi sekmesine ve ardından Günlüğü Etkinleştir'e tıklayın.

  4. Günlük biçiminin W3C Genişletilmiş Günlük Dosyası Biçimi olduğundan emin olun.

  5. Özellikler'e tıklayın.

  6. Gelişmiş sekmesine ve ardındanGenişletilmiş Özellikler'e tıklayın.

  7. Genişletilmiş Özellikler'in altında Tanımlama Bilgisi (cs(Tanımlama Bilgisi)) onay kutusunu ve Başvuran (cs(Başvuran)) onay kutusunu seçmek için tıklayın.

Bu sorun oluştuktan sonra, sorunun hangi istemcide olduğunu ve bu istemcinin IP adresini belirleyin. İstemcinin IP adresinde IIS oturumunu filtreleyin ve <tanımlama bilgisi> sütununu görüntüleyin.Not IIS Günlüklerini ayrıştırmak için Günlük Ayrıştırıcısı'nı kullanabilirsiniz. Günlük Ayrıştırıcısı'nı indirmek için aşağıdaki Microsoft Web sitesini ziyaret edin:

http://www.microsoft.com/download/details.aspx?FamilyID=890cd06b-abf8-4c25-91b2-f8d975cf8c07 Belirli bir kullanıcıdan gelen isteklerin listesini aldıktan sonra oturum açma sayfasına yönelik istekleri arayın. Bu sayfaya yönlendirildiklerini biliyorsunuz ve yeniden yönlendirme gerçekleşmeden önce istekleri görmek istiyorsunuz. Aşağıdakine benzer bir şey görürseniz, istemci tanımlama bilgisini göndermemiş veya tanımlama bilgisi istemci ile sunucu arasında ağ üzerinden kaldırılmıştır.Bu, ilk oturum açma işlemidir.

Yöntem

Sayfası

Yanıt

Tanımlama bilgileri

AL

/Default.aspx

302 (Yeniden Yönlendirme)

Tanımlama Bilgisi Yok

AL

/Login.aspx

200 (Başarılı)

Tanımlama Bilgisi Yok

YAYINLA

/Login.aspx

302 (Yeniden Yönlendirme)

Tanımlama Bilgisi Yok

AL

/Default.aspx

200 (Başarılı)

. ASPXAUTH

AL

/SomePage.aspx

302 (Yeniden Yönlendirme)

No. ASPXAUTH Tanımlama Bilgisi

Bunlar diğer istekler ve ardından sitedeki bir sayfaya yönelik istekler. ASPXAUTH tanımlama bilgisi.

Yöntem

Sayfası

Yanıt

Tanımlama bilgileri

AL

/SomePage.aspx

302 (Yeniden Yönlendirme)

No. ASPXAUTH Tanımlama Bilgisi

AL

/Login.aspx

200 (Başarılı)

No. ASPXAUTH Tanımlama Bilgisi

YAYINLA

/Login.aspx

302 (Yeniden Yönlendirme)

No. ASPXAUTH Tanımlama Bilgisi

AL

/SomePage.aspx

200 (Başarılı)

. ASPXAUTH

Not Kalıcı bir tanımlama bilgisi oluşturmadığınız sürece bu kullanıcıdan gelen ilk isteğin form kimlik doğrulama tanımlama bilgisi olması olası değildir. IIS Günlüğü size yalnızca istekte alınan tanımlama bilgilerini gösterir. Form kimlik doğrulaması tanımlama bilgisinin ilk isteği başarılı bir oturum açma girişiminden sonra istekte olacaktır.

Senaryo 2

İstemcinin tanımlama bilgisi sınırı aşıldığında form kimlik doğrulaması tanımlama bilgisi de kaybolabilir. Microsoft Internet Explorer'da 20 tanımlama bilgisi sınırı vardır. İstemcide 20. tanımlama bilgisi oluşturulduktan sonra, önceki tanımlama bilgileri istemcinin koleksiyonundan kaldırılır. ise. ASPXAUTH tanımlama bilgisi kaldırılır, bir sonraki istek işlendiğinde kullanıcı oturum açma sayfasına yönlendirilir.Bu iki senaryoyla ilgili sorunları aynı şekilde giderebilirsiniz. Oturum açma sayfasına yeniden yönlendirmeden hemen önceki isteğe bakın. Bu sayfaya gönderilen istek tanımlama bilgileri oluşturursa, bu araştırılacak bir şey olacaktır.İstemciye gönderilen HTTP üst bilgilerini görüntülemek için Fiddler'ı kullanabilirsiniz. Trafiği yakaladıkktan sonra, bir isteğe çift tıklayın ve ardından Üst Bilgiler'e tıklayarak Set-Cookie üst bilgisini görün. Başarılı bir oturum açmayı izlerseniz, başarılı bir oturum açma işleminin yanıtında Set-Cookie üst bilgisini görürsünüz.Fiddler'ı indirmek için aşağıdaki Fiddler Web sitesini ziyaret edin:

http://www.fiddlertool.com/fiddler/

Senaryo 3

İstek istemciden ayrıldıktan sonra, gönderilen paketleri etkileyebilecek çeşitli katmanlar vardır. Bir ağ cihazının tanımlama bilgisini kaldırıp kaldırmadığını belirlemek için istemcide ve sunucuda bir ağ izlemesi yakalamanız ve ardından tanımlama bilgisi isteğinin gövdesine bakmanız gerekir. Tanımlama bilgisinin gönderildiğinden emin olmak için istemci isteğine bakmak ve sunucunun tanımlama bilgisini aldığından emin olmak için sunucu izlemesini denetlemek istiyorsunuz.İstemci isteği Bu, kullanıcının kimliği doğrulandıktan sonra bir GET isteğidir. Form kimlik doğrulama bileti bilgileri mavi renkle vurgulanır. Bu, tanımlama bilgisi bilgilerinin istemciden ayrıldığını onaylar. Netmon gibi bir ağ yakalama aracı kullandığınızda bağdaştırıcıdan geçen trafiği görürsünüz.

47 45 54 20 68 74 74 70-3a 2f 2f 6c 6f 63 61 6c   GET http://local
68 6f 73 74 2f 46 6f 72-6d 73 41 75 74 68 4c 6f   host/FormsAuthLo
67 54 65 73 74 2f 57 65-62 46 6f 72 6d 31 2e 61   gTest/WebForm1.a
73 70 78 20 48 54 54 50-2f 31 2e 31 0d 0a 41 63   spx HTTP/1.1..Ac
63 65 70 74 3a 20 69 6d-61 67 65 2f 67 69 66 2c   cept: image/gif,
…Other headers of the GET request…
63 68 65 0d 0a 43 6f 6f-6b 69 65 3a 20 2e 41 53   che..Cookie: .AS
50 58 41 55 54 48 3d 33-43 45 46 39 42 39 41 30   PXAUTH=3CEF9B9A0
43 33 37 41 44 46 36 33-45 36 42 44 33 37 42 36   C37ADF63E6BD37B6
39 43 44 41 32 35 30 30-30 46 38 30 37 32 38 46   9CDA25000F80728F
35 31 43 39 35 36 36 44-31 34 43 35 34 31 34 35   51C9566D14C54145
38 31 43 39 33 45 32 41-30 31 44 44 43 44 45 46   81C93E2A01DDCDEF
32 34 41 31 37 34 32 39-34 31 30 43 30 39 37 34   24A17429410C0974
42 33 45 43 42 30 36 34-32 32 38 45 33 35 33 39   B3ECB064228E3539
39 41 38 32 32 42 33 42-39 33 36 44 46 30 38 46   9A822B3B936DF08F
42 41 42 44 33 45 31 30-32 44 30 30 32 31 30 43   BABD3E102D00210C
32 45 31 33 39 38 30 37-39 42 32 33 35 32 39 46   2E1398079B23529F
34 46 35 44 37 34 41 3b-20 50 72 6f 66 69 6c 65   4F5D74A; Profile
3d 56 69 73 69 74 6f 72-49 64 3d 62 32 34 65 62   =VisitorId=b24eb

Sunucu tarafı isteği Sunucuya ulaşan isteğe baktığınızda, sunucunun istemcinin gönderdiği bilgileri aldığından emin olmak istersiniz. Sunucu aynı bilgileri almadıysa, tanımlama bilgisinin kaldırıldığı yeri belirlemek için ağdaki diğer cihazları araştırmanız gerekir.Not IsAPI filtrelerinin tanımlama bilgilerini kaldıran örnekleri de vardır. Web sunucusunun tanımlama bilgisini aldığını onaylarsanız ancak tanımlama bilgisi IIS günlüklerinde listelenmiyorsa ISAPI filtrelerini denetleyin. Sorunun çözülmüş olup olmadığını görmek için filtreleri kaldırmanız gerekebilir.

Form kimlik doğrulama bileti zaman aşımına uğradı

Bir kullanıcının yeniden yönlendirilmesinin diğer yaygın nedeni, form kimlik doğrulama biletinin süresinin dolmasıdır. Form kimlik doğrulama bileti iki şekilde zaman aşımına neden olabilir. İlk senaryo, mutlak süre sonu kullanırsanız gerçekleşir. Mutlak süre sonuyla, kimlik doğrulama biletinin süresi sona erdiğinde sona erer. Örneğin, 20 dakika süre sonu ayarlarsınız ve bir kullanıcı saat 14:00'te siteyi ziyaret edecek. Kullanıcı 14:20'den sonra siteyi ziyaret ederse oturum açma sayfasına yönlendirilir.Kayan süre sonu kullanıyorsanız senaryo biraz daha karmaşıktır. Son kullanma süresi yarı dolduktan sonra kullanıcı siteyi ziyaret ederse tanımlama bilgisi ve sonuçta elde edilen bilet güncelleştirilir. Örneğin, kayan süre sonu kullanarak 20 dakikalık bir süre sonu ayarlarsınız. Bir kullanıcı siteyi saat 14:00'te ziyaret eder ve kullanıcı 14:20'de süresi dolacak şekilde ayarlanmış bir tanımlama bilgisi alır. Süre sonu yalnızca kullanıcı siteyi 14:10'dan sonra ziyaret ederse güncelleştirilir. Kullanıcı siteyi 14:09'da ziyaret ederse, son kullanma süresinin yarısı geçmediği için bilet güncelleştirilmez. Kullanıcı 12 dakika beklerse, saat 14:21'de siteyi ziyaret ederse biletin süresi dolar. Kullanıcı oturum açma sayfasına yönlendirilir.Bu tür bir soruna yaklaşmanın bir yolu, form kimlik doğrulama tanımlama bilgisini ve bilet bilgilerini günlüğe kaydetmektir. Bu şekilde, tanımlama bilgisinin IIS tarafından alınıp alınmadığını ve değerlerin ne olduğunu görebilirsiniz. Bunu yapmak için bir HttpModule yazıp bu modülü istek işlem hattına takabilirsiniz. İhtiyacınız olan bilgileri almak için uygulamanızın kodunu değiştirmeniz gerekmez.Ekli örnek, Microsoft .NET Framework 1.1 ve .NET Framework 2.0'da çalışır ve tüm açıklamaları vardır. Örnek aşağıdaki dosyaları içerir:

  • FormsAuthEvents.cs: IHttpModule uygulayan ve Application_BeginRequest olayıyla bağlantı oluşturan sınıf.

  • FormsAuthInfo.cs: Tanımlama bilgisini alan ve forms kimlik doğrulama anahtarının şifresini çözen sınıf. Ayrıca form kimlik doğrulamasının etkinleştirildiğinden emin olmak için uygulamanın Web.config dosyasını denetler.

  • FormsAuthConfig.cs: FormsAuthLogger.config dosyasındaki bilgileri okuyan sınıf.

  • Log.cs: Dize oluşturucuyu kabul eden ve değerleri günlük dosyasına yazan dosya.

  • FormsAuthLogger.config: Log.cs dosyası tarafından okunan XML dosyası. Bu dosyanın Yerleşik DLL ile /bin klasöründe olması gerekir. Dosya aşağıdakileri yapılandırmanıza olanak tanır:

    • IP'ye göre filtrele: Verilerin yakalanmasını istemci IP'sine göre filtreleyebilirsiniz. Bu şekilde, yalnızca sorunu yeniden ürettiği bilinen bir istemciden gelen istekleri günlüğe kaydedebilirsiniz. Bu, günlüğün boyutunu küçültür.

    • Yakalama Türü: Dosyanın kaydedileceği yeri belirtir. Varsayılan, Geçici ASP.NET Dosyaları klasörüdür, ancak çalışan işlem hesabı klasöre yazma özelliğine sahip olduğu sürece bunu her yere kaydedebilirsiniz.

Not FormsAuthLogger.zip dosyasında sağlanan kod için bir indirme bağlantısı sağlayacağım.Burada ana alanları işaret edeceğim:

  1. IHttpModule arabirimini uygulayan bir sınıf oluşturun.

    public class FormsAuthEvents : IHttpModule 
    {
    …code…
    }
  2. Bakmak istediğiniz olayı bağlama. Bu örnekte Application_BeginRequest olayını kullanıyoruz. Bu şekilde her isteği araştırabilir ve forms kimlik doğrulama tanımlama bilgisine sahip olup olmadığını belirleyebilir ve tanımlama bilgisi varsa FormsAuthenticationTicket'i günlüğe kaydedebiliriz.

    public void Init(HttpApplication application) 
    {
    //Wire up the BeginRequest event
    application.BeginRequest += (new EventHandler(this.Application_BeginRequest));
    }
  3. Application_BeginRequest olayını uygulayın.

    private void Application_BeginRequest(Object source, EventArgs e)
    {
       …code to log the ticket…
    }
    
  4. Form kimlik doğrulama tanımlama bilgisini alın ve şifresini çöz.

  5. Değerleri günlüğe kaydetme. Form bilgilerine ek olarak aşağıdakileri günlüğe kaydetmenizi öneririz. Bu, gerekirse form kimlik doğrulama bilgilerinizi IIS günlüklerine göre ayarlamanıza yardımcı olur:

    • Tarih: İsteğin ne zaman geldiğini görmenizi sağlar.

    • RequestType: İsteğin Get mi yoksa Post mu olduğunu gösterir.

    • URL: Soruna yol açan istek desenini gösterir.

    • Referrer

    • ClientIP: İsteklerdeki bağlantıları belirli bir istemciye bağlar.

Daha fazla yardıma mı ihtiyacınız var?

Daha fazla seçenek mi istiyorsunuz?

Abonelik avantajlarını keşfedin, eğitim kurslarına göz atın, cihazınızın güvenliğini nasıl sağlayacağınızı öğrenin ve daha fazlasını yapın.

Topluluklar, soru sormanıza ve soruları yanıtlamanıza, geri bildirimde bulunmanıza ve zengin bilgiye sahip uzmanlardan bilgi almanıza yardımcı olur.