2014-08-28 35 views
0

希望大家都很好。 我使用MVC C#,AspNet.Identities并拥有一个功能齐全的账户控制器。如何在通过Web SignalR Hub断开连接时注销用户?

我最近在项目中引入了一个基本的SignalR Hub,我想在用户从集线器断开连接后登录用户。我的想法是从账户控制器调用LogOff方法。

Hub非常简单,事实上,如果我没有弄错,我从Scott Hanselman的视频中看到了这一点。只是hitCounter的一部分...现在我试图添加注册()功能。

这是我到目前为止。

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult LogOff() 
    { 
     AuthenticationManager.SignOut(); 

     return RedirectToAction("Welcome", "Home"); 
    }//this is in my account controller 


[Authorize] 
[HubName("hitCounter")] 
public class GameplayHub : Hub 
{ 
     private static int intCounter = 0; 

     public void RecordHit() 
     { 
      intCounter += 1; 
      this.Clients.All.onHitRecorded(intCounter); 
     } 

     public override System.Threading.Tasks.Task OnDisconnected(bool stopCalled) 
     { 
      Final.Controllers.AccountController obj = new Final.Controllers.AccountController(); 
      intCounter -= 1; 
      this.Clients.All.onHitRecorded(intCounter); 
      this.Clients.Caller.onHitRecorded(obj.LogOff()); 
      obj.LogOff(); 

      return base.OnDisconnected(stopCalled); 

     } 

}//this is the hub 


<div id="hitCount" style="font-size:50px;"></div> 

<script src="~/Scripts/jquery-1.6.4.js"></script> 
<script src="~/Scripts/jquery.signalR-2.1.1.js"></script> 
<script src="/signalr/hubs"></script> 

<script> 
    $(function() { 
     var con=$.hubConnection(); 
     var hub=con.createHubProxy('hitCounter'); 
     hub.on('onHitRecorded', function (i) { 
      $('#hitCount').text(i); 
     }); 
     con.start(function() { 
      hub.invoke('recordHit'); 
     }); 
    }) 
</script>//My view...just shows how many people active at that point... 

活跃的人数,显示正确。我在我的应用程序中试图做的是,如果用户位于2个选项卡上,并且他关闭了一个,则必须在两个选项卡上注销。

任何帮助将不胜感激!谢谢:)

回答

0

不幸的是它不会工作。注销用户是通过删除必须由浏览器完成的cookie来完成的。 SignalR在标签已关闭后运行断开连接的处理程序,因此您无法通知浏览器删除cookie。

可以工作的解决方案是强制重定向到用户打开的第二个选项卡上的注销页面。

伪代码:

在SignalR毂:

Task OnDisconnected() 
{ 
    var otherTab = FindOtherTabWithUser(); 
    otherTab.forceLogOff(); 
} 

在JavaScript:

forceLogOff = function() { window.location.href = '/logoff'; } 
相关问题