9 Nisan 2013 Salı

Ajax request için forms authentication zaman aşımı(timeout) kontrolü

Merhaba arkadaşlar, öncelikle bu yazının nedenini yazalım. Asp.NET MVC ile bir uygulama geliştiriyorsunuz ve forms authentication kullanıyorsunuz. Bu uygulamanız içesinde birden fazla yerde ve birden farklı yöntemlerle ajax metotlarını kullanıyor olabilirsiniz. Forms authentication ve session timeout sonrasında çağıracağınız bir ajax metodu uygulamanızda hataya sebep olacaktır. Timeout sonrasında login sayfasına yönlendirme işlemini yapmak için aşağıdaki örneği kullanabilirsiniz.

Adım 1: Sayfanızda veya layout dosyasınızda aşağıdaki jquery fonksiyonunu eklemeniz gerekiyor.










ajaxComplete metodu adından da anlaşılacağı gibi tüm ajax methotlarının tamamlanmasından sonra çağrılan metottur. Gördüğünüz gibi ajax metodunun tamamlanmasından sonra http status kontrol ediliyor eğer bu kod 401(Unauthorized) ise sayfayı loginURL'e yönlendiriyoruz.

Adım 2: Yukarıdaki işlem yeterli gibi görünse de önemli bir problem var. Yukarıda tanımladığımız xhr.status 401 olması için request'i handle etmeniz gerekecektir. Bir örnekle bu problemi anlatalım. Örneğin tanımladığınız bir ajax metodu var ve sonucunda JSON değer dönüyor. Fakat bu metodu çağırdığınızda forms authentication zaman aşımına uğramış ise siz JSON beklerken sayfa size login url'deki sayfa içeriğini getirir ve normal bir sayfa içeriği yüklediği için status 200 olacaktır. Bu sorunu aşmak için de global.asax dosyasında request'in sonlandığı yerde response'u değiştiriyoruz.





4 yorum:

  1. Öncelikle teşekürler
    Çok yararlı bir bilgi paylaşmışsınız fakat bir sorum olucak
    request handle ettiğimiz yerde if bloğu içinde statscode control ünü 302' ye göre kontrol ettmişsiniz oysa bende timeout olsa bile sürekli 200 dönüyor bir fikriniz varmıdır.Yardımlarınızı bekliyorum

    YanıtlaSil
  2. Merhaba Ersel,
    200 dönmesi için aklıma gelen 3 neden var.
    1- Çağırdığın metotta veya onu kapsayan class'ta Authorize etiketi var mı? Login page'e yönlendirilmeni sağlayan bu etikettir.
    2- Single page bir uygulama yapıyorsundur ve login ekranında secure sayfalarında aynı sayfada farklı durumlarda gösteriliyordur. Bu nedenle login sayfası başka bir sayfa olmadığı için 302 değil de 200 döner.
    3- Ajax metodu çağırmak için kullandığın jquery ajax metodundaki async özelliği false'tur ve IsAjaxRequest'i geçemiyorsundur ve aslında 200 olarak gördüğün başka bir requesttir.
    Aklıma gelen sebepler bunlar, olur da bunlar problemine çözüm olmazsa yaptığın kodla ilgili kısa bir örneği gönderirsen o örneğe göre çözmeye çalışırız.
    Kolay gelsin.

    YanıtlaSil
    Yanıtlar
    1. Merhabalar
      Hızlı cevap için teşekkür ederim!Yukarıdaki dediklerinizi kontrol ettim ve bir case bulamadım.Ancak kod bloğunu aşağıdaki gibi değiştirdim ve normal çalıştığını gördüm.Bir yanlışlık olmayacağını düşünüyorum aşağıdaki gibide

      if (!User.Identity.IsAuthenticated && context.Request.IsAjaxRequest())
      {
      context.Response.Clear();
      context.Response.StatusCode = 401;
      }

      Sil
    2. Herhangi bir hataya sebep olmaz.Farklı bir yoldan da olsa çözmüş olmana sevindim . iyi çalışmalar...

      Sil