2013-11-26 16 views
5

Forms Authentication kullanan MVC 4 uygulamasında SignalR up'ı çalıştırıyorum. Sürenin dolmasıyla 20 dakikaya ayarlanmış çerez zaman aşımına sahibim.SignalR istisnası "Tanınmayan kullanıcı kimliği. Etkin bir SignalR bağlantısı sırasında kullanıcı kimliği değişemez."

Bir zamanlayıcıda çalışan bir javascript işlevim var, böylece 20 dakika ve 1 saniye sonra sayfayı yeniler ve kullanıcı Giriş sayfasına yönlendirilir. Güvenlik nedenleriyle bunu yapmam çok önemli ve iyi çalışıyor.

Sorunum, Kullanıcı kimliği değiştiğinden, SignalR'nin InvalidOperation istisnası atmasıdır. Bunu neden yaptığını anlıyorum ama nasıl önleneceğinden emin değilim.

$ .connection.hub.stop(); sayfayı yeniden yüklemeden önce, ancak çalışmıyor. Tanımlama süresi dolmadan önce 5 saniye aramayı denedim ancak bu yalnızca oturumu yeniden etkinleştirir.

Herhangi bir fikir takdir edilecektir!

Teşekkür John

cevap

2

Ben Github David Fowler (SignalR yazarı) ile ilgili ve o bu çözmenin kolay bir yolu olmadığını söyledi.

Sorunu gidermek için, kullanıcı oturumunu yalnızca öldüren bir Sessiz Oturum denetleyicisi eylemi gerçekleştirdim.

[HttpPost] 
    [AjaxOnly] 
    public ActionResult SilentLogOff() 
    { 
     _unitOfWork.WebSecurity.Logout(); 

     return Json(new 
     { 
      IsSuccess = true, 
     }); 
    } 

Sonra Formlar kimlik doğrulama zaman aşımı kısa 10 saniye olmak JS zamanlayıcı ayarlandı. Süre dolduğunda, SignalR hub bağlantısını durdurur, SilentLogout eylemine POST yapar ve ardından sayfayı yeniden yükler. Bunun anlamı doğru davranış sonuçlanan

SetLogoutTimer: function() { 

    var formsTimeoutValue = $("#hdnRefreshTimeout").val(); 

    clearTimeout("formsTimeoutTimer"); 

    var formsTimeoutTimer = setTimeout(function() { 
     $.connection.hub.stop(); 

     AppName.Authenticated.SilentLogoutUser(); 

    }, formsTimeoutValue); 
} 

SilentLogoutUser: function() { 
    var url = $("#logout a").attr("data-bind-silent-url"); 
    $.ajax({ 
     type: "POST", 
     url: url, 
     success: function (response) { 
      if (response.IsSuccess === true) { 
       window.location.reload(true); 
      } 

     } 
    }); 
} 

hiçbir SignalR istisna değildir ve kullanıcı onlar yeniden doğruluğunun kanıtlanması sonra olduğumuzu önceki sayfaya yönlendirilir.

+0

Bu gerçekten sorunu çözdü mü? Bazı kodlar gönderir misiniz? – WebDever

+0

Merhaba kod örnekleri eklendi. Yine de benim için çalışıyor. Bu bir javascript çözümü olsa da, tüm senaryolara uymayacak. Uygulamamda, javascript etkin olmadığı sürece kullanıcı giriş yapamaz. –