Çözüldü ASP.NET MVC ile session kontrolü

Bu konu çözüldü olarak işaretlenmiştir. Çözülmediğini düşünüyorsanız konuyu rapor edebilirsiniz.

khalannz7

Centipat
Katılım
18 Ağustos 2022
Mesajlar
528
Çözümler
7
Yer
İstanbul
Daha fazla  
Cinsiyet
Erkek
Merhaba, sessiontimeout özelliğini 15 dakika olarak ayarladım, 15 dakika geçtikten sonra yönlendirme yapmak istiyorum. Bunun için session_end'in içinde yönlendirmemi yaptım ama istemci tarafında yönlendirmeyi yapmıyor. Bende bir JavaScript fonksiyonu yazıp her 1 dakikada sessionu kontrol eden bir Controllere istek atıp, yönlendirme yapmayı düşündüm. Sizce bu yöntem mantıklı mı? Alternatif olarak ne önerirsiniz?
 
Çözüm
Benimle aynı soruna düşen arkadaşlar için alternatif bir çözüm sunuyorum. Auth filterimda Ajax isteği kontrolü yapıp eğer session null ise ve bu işlem Ajax isteği ise JSON döndürdüm. Dönen JSON'u Ajax'ta yakalayıp logine yönlendirdim. İşe yaradı.
Kod:
if (HttpContext.Current.Session["UsersDetails"] == null)
            {
                if (filterContext.HttpContext.Request.IsAjaxRequest())
                {
                    filterContext.Result = new JsonResult
                    {
                        Data = new { result = false, timeoutUrl = "/Login/Login" }, JsonRequestBehavior = JsonRequestBehavior.AllowGet
                    };
                }
Global.asax'te Session_End metodunu kullanabilirsiniz. Surekli istek sunucuya istek atmak gereksiz yuk bindirir.
 
Tabii, simdi anliyorum problemi. Oncelikle sunu aciga kavusturalim. Browserlar Process-kill edildiginde vs. durust davranarak ASP uygilamasina Session'ın bitmesi gerektigini soyleyemez. Bu sorunu cozmek icin ise her session'a bir timeout atanir. Ornegin 10 dk sonra yaratilan session, timeouta ugrar ve session kapanir. Bu otomatik kapanma surecinde de session_end HttpContext'ten bagimsiz calisacak. Yani ortada bir httpcontext yok, uygulama kendi icinde session'u sildigi icin o metodu cagiriyor. Bu yuzden yonlendirebilecek Request yok, Response yok. Zaten olsaydi timeout'a ugramazdiniz.

Bu problemi cozmek icin her dakika istek atip bakarsaniz uygulama devamli istek alacagi icin Session zaten bitmez. Onun yerine timeout suresini bekleyen bir timer baglayin. Her sunucu isteginde timer'i sifirlayin. Sure sifira ulasirsa farkli sayfaya yonlendirirsiniz.
 
Tabii, simdi anliyorum problemi. Oncelikle sunu aciga kavusturalim. Browserlar process-kill edildiginde vs. durust davranarak ASP uygilamasina Session'ın bitmesi gerektigini soyleyemez. Bu sorunu cozmek icin ise her Session'a bir timeout atanir. Ornegin 10 dk sonra yaratilan session, timeouta ugrar ve session kapanir. Bu otomatik kapanma surecinde de session_end httpcontext'ten bagimsiz calisıcak. Yani ortada bir httpcontext yok, uygulama kendi icinde Session'u sildigi icin o metodu cagiriyor. Bu yuzden yonlendirebilecek request yok, response yok. Zaten olsaydi Timeout'a ugramazdiniz.

Bu problemi cozmek icin her dakika istek atip bakarsaniz uygulama devamli istek alacagi icin session zaten bitmez. Onun yerine timeout suresini bekleyen bir timer baglayin. Her sunucu isteginde Timer'i sifirlayin. Sure sifira ulasirsa farkli sayfaya yonlendirirsiniz.

Kod:
//SESSION TIMEOUT CONTROL.
var sessionTimeoutInMinutes = 18;
var lastInteractionTime = new Date().getTime();

function resetInteractionTime() {
 lastInteractionTime = new Date().getTime();
}

document.addEventListener("mousemove", resetInteractionTime);
document.addEventListener("keydown", resetInteractionTime);
document.addEventListener("click", resetInteractionTime);

var checkUserActivity = setInterval(function () {
 var currentTime = new Date().getTime();
 var elapsedTime = (currentTime - lastInteractionTime) / 1000;

 if (elapsedTime > sessionTimeoutInMinutes * 60) {
 window.location.href = "/Login/LogOut";
 clearInterval(checkUserActivity);
 }
}, 60000);

Ben direkt böyle yaptım hocam. Hiç sunucuya yönlendirmiyorum sunucuda timeout 20 dakika olarak ayarladım. Yani aslında hiç timeout yaşamıyor kullanıcı direkt çıkışa yönlendiriyorum.
 
Aslinda soyle, hata su ki sayfa icindeki eventler sunucuya istek atmadigi icin timeout sayacini sifirlamaz. Yani timeout olaylari sadece servera istek atildiginda sifirlar. Uygulamanizla sunucu arasinda session anlasmazligi cikabilir su an.
 
Aslinda soyle, hata su ki sayfa icindeki Event'ler sunucuya istek atmadigi icin timeout sayacini sifirlamaz. Yani timeout olaylari sadece servera istek atildiginda sifirlar. Uygulamanizla sunucu arasinda session anlasmazligi cikabilir su an.

Aynen hocam bende tam onu araştırıyordum şu an. Web. Config'de sessiontimeout ne zaman sıfırlanır ne zaman sıfırlanmaz diye. Eğer dediğiniz gibiyse durum vahim aslında :D benim burada bir istek kontrolü yapmam gerekir sanırım.
 
Aslinda surekli session kontrolune gerek yok ki? Zaten session timeout yemisse yeni istek atildiginda otomatik olarak login'e gidecek. Neden cansiz sayfayi yonlendirmek istiyorsunuz?

Zaten front-end yonlendirmelerin hepsi kullanici tarafindan iptal edilebilir. E-okul harici ölü session kontrolu yapan bir site gormedim.
 
Aslinda surekli session kontrolune gerek yok ki? Zaten session timeout yemisse yeni istek atildiginda otomatik olarak Login'e gidecek. Neden cansiz sayfayi yonlendirmek istiyorsunuz?

Zaten Front-End yonlendirmelerin hepsi kullanici tarafindan iptal edilebilir. e-Okul harici ölü session kontrolu yapan bir site gormedim.

Hocam test ettim ve şöyle ki eğer session biterse kullanıcının, kullanıcıyı yönlendiremiyorum login sayfasına. Bunun için bir kod yazdım ama bu sadece sayfa değiştiğinde, yani sayfa yenilendiğinde yönlendiriyor. Örnek vereyim diyelim ürünler sayfasında kullanıcının sessionu bitti, eğer başka sayfaya geçmek isterse veya sayfa yenilemek isterse logine yönlendiriyor. Ama o sayfada kalırsa yönlendirmiyor ve ürün ekleyip silmek istediğinde işlemler Ajax olduğu için sistemsel bir hata oluştu mesajı dönüyor bana. Zaten istediğim bu sessionu yokken işlem yapamasın istiyorum ama o butona da basamasın yani. Direkt bir işlem yapmak istediğindede logine yönlendirsin.
 
Tamam, söylediğim gibi yapın o zaman. 20 dakikalik bir sayac olusturun. Sonra AJAX isteklerinde sayaci sifirlayin. Sayac 0 olunca JavaScript ile yonlendirin.
 

Geri
Yukarı