2013-04-08 22 views
10

Form kimlik doğrulaması ile MVC4 C# web uygulaması ile SignalR 1 kullanıyorum. Ben JavaScript benim düzeni sayfasında bir kod var:İstemci tarafındaki sunucu bağlantısını keser

$(documnet).ready(function(){ 
     connect to hub code ... 
}) 

Bir kullanıcı göbek oluşturacak ve o giriş yapar sonra tekrar bağlanmak ve Tamam doğrulamak başlamak kesmek istiyorum. hesabımı denetleyici ve yöntemi içinde sunucu tarafında yapmak istiyorum:

public ActionResult LogOn(LoginModel model, string returnUrl) 
{ 
    if (ModelState.IsValid) 
    { 
     if (System.Web.Security.Membership.ValidateUser(model.UserName, model.Password)) 
     { 
      FormsAuthentication.SetAuthCookie(model.UserName, false); 
      ....here , disconnect from hub 
      ....to make the user reconnect  
} 

ben kullanıcı giriş sonra doğrulanmış olarak değiştirildi ve bağlantı kalırsa SignalR bir hata atar çünkü öyle yapmak istiyorum neden. hatadır:

bağlantı kimliği yanlış formatta olduğunu.

cevap

20

durdurup sunucudan SignalR bağlantılarını başlatılamaz. Eğer sunucu SignalR aracılığıyla arayabilir, istemci üzerinde bir bağlantı kesme olayı yazmaktır ne sormak yapabilirdi

$.connection.hub.stop(); //on the client before the user attempts to log on and then call 
$.connection.hub.start(); //after the log on attempt has completed. 
+0

yılında kesmek müşteri zorlamak için. başla();" Her belgede hazır durumu ... "$ .connection.hub.stop();" önce ? –

+0

Kullanıcı, hub'a bağlandığında onu istemciden almalı ve onu yeni bağlantılarla karşılaştırmak için saklayacaktır, bu da kimliğe bürünme saldırılarını da engelleyecektir. –

12

Tek yön aramak gerekir. biraz böyle Belki bir şey:

myHub.client.serverOrderedDisconnect = function (value) { 
    $.connection.hub.stop(); 
}; 

Sonra sunucuda şey böyle:

Clients.Client(Context.ConnectionId).serverOrderedDisconnect(); 
+0

ancak "LogOn" eyleminin içinden sunucu tarafı kodundan Context.ConnectionId'yi nasıl alabilirim? –

1

bu deneyin:

public ActionResult LogOn(LoginModel model, string returnUrl) { 
    if (ModelState.IsValid) { 
     if (System.Web.Security.Membership.ValidateUser(model.UserName, model.Password)) { 
      FormsAuthentication.SetAuthCookie(model.UserName, false); 
      connection.Stop(); 
     } 
} 

bağlantı kolu varsayarsak connection olduğunu. Buradaki zorluk, Eylem Metodu'nuzdaki connection nesnesine bir tanıtıcıya erişmektir.

+0

ancak "bağlantı" nesnesini "LogOn" eyleminin içindeki sunucu tarafı kodundan nasıl alabilirim? –

+1

iyi soru. Bu iyi düşünmedim. Muhtemelen yanlış görünüyor oturumu sürece sürece, kolayca mevcut olmazdı ... –

4

Javascript'ten her şeyi kontrol etmeyi deneyin. Aşağıdaki bir çıkış örneğidir, giriş benzer olacaktır. http://www.asp.net/signalr/overview/security/introduction-to-security itibaren

:

aktif bağlantı bulunmakla birlikte, bir kullanıcının kimlik doğrulama durum değişiklikleri, kullanıcı bildiren bir hata alırsınız ise "kullanıcı kimlik aktif SignalR bağlantısı sırasında değiştirilemez." Bu durumda, uygulamanız, bağlantı kimliğinin ve kullanıcı adının koordine edildiğinden emin olmak için sunucuya yeniden bağlanmalıdır. senin Uygulamada etkin bağlantı var iken kullanıcı oturumunu izin verirse Örneğin, bağlantı için kullanıcı adı artık bir sonraki istek için geçirilen adı eşleşir. Kullanıcı oturumu kapatmadan önce bağlantısını durdurmak ve daha sonra yeniden başlatmak isteyeceksiniz.

Ancak, uygulamaların bir çoğu elle durdurmak ve bağlantıyı başlatmak için gerekmez dikkat etmek önemlidir. Uygulamanızın kullanıcı oturumunu kapattıktan sonra, Web Formları uygulamasında veya MVC uygulamasında varsayılan davranışı veya oturum açtıktan sonra ayrı bir sayfaya yönlendirirse, çıkış yaptıktan sonra geçerli sayfayı yeniler, etkin bağlantı otomatik olarak kesilir ve gerekmez herhangi bir ek eylem.

Aşağıdaki örnek, kullanıcı durumu değiştiğinde bağlantının nasıl durdurulacağını ve başlatılacağını gösterir.

Use HttpContext.Current.Response.End(); 

sizin Hub içine

<script type="text/javascript"> 
$(function() { 
    var chat = $.connection.sampleHub; 
    $.connection.hub.start().done(function() { 
     $('#logoutbutton').click(function() { 
      chat.connection.stop(); 
      $.ajax({ 
       url: "Services/SampleWebService.svc/LogOut", 
       type: "POST" 
      }).done(function() { 
       chat.connection.start(); 
      }); 
     }); 
    }); 
}); 

-3

kopyalayıp aşağıdaki işlevi yapıştırın göbek Ben "$ .connectino.hub diyoruz

+0

Dilbilgisi ve sunum sorunları bir yana, bu çözüm ile downvotes neden olacak herhangi bir teknik sorunlar var mı? –

İlgili konular