ASP.NET MVC-获取用户的登录状态

皇家Swish

在我的应用程序中,我想检查特定用户是否已登录,因此我可以显示一个状态,表明该用户与另一个用户“联机”或“脱机”。这个问题与认证用户无关,仅与获得用户的认证状态有关。

我将如何实现这一目标?

埃米尔·贝基拉伊(Ermir Beqiraj)

我认为一种选择是使用一些实时解决方案。例如SignalR用户登录后,将其连接到集线器。OnConnected()操作保存其状态。然后OnDisconnected()从“ OnlineRepository”中删除。

用示例更新这是我在asp.Net Mvc 5应用程序中执行此操作的方法。

  • 持有单个用户的Model类,例如:

    
        public class SingleConnection 
        {
            public SingleConnection()
            {
                ConnectionId = new List();
            }
            public string Id { get; set; }
            public List ConnectionId { get; set; }
        }
    
  • 连接映射类,有助于添加/删除列表中的用户和从列表中获取用户

    
        public class ConnectionMapping
        {
            private readonly List _connections = new List();
            public int Count
            {
                get
                {
                    return _connections.Count;
                }
            }
            public void Add(string key, string connectionId)
            {
                lock (_connections)
                {
                    var sn = _connections.Where(x => x.Id == key).FirstOrDefault();
                    if (sn != null) // there is a connection with this key
                    {
                        _connections.Find(x => x.Id == key).ConnectionId.Add(connectionId);
                    }
                    else
                    {
                        _connections.Add(new SingleConnection { Id = key, ConnectionId = new List { connectionId } });
                    }
                }
            }
            public List GetConnections(string id)
            {
                var con = _connections.Find(x => x.Id == id);
                return con != null ?  con.ConnectionId : new List();
            }
            public List AllConnectionIds() 
            {
                List results = new List();
                 var allItems = _connections.Where(x => x.ConnectionId.Count > 0).ToList();
                 foreach (var item in allItems)
                 {
                     results.AddRange(item.ConnectionId);
                 }
                 return results;
            }
            public List AllKeys() 
            {
                return _connections.Select(x => x.Id).ToList();
            }
            public void Remove(string key, string connectionId)
            {
                lock (_connections)
                {
                    var item = _connections.Find(x => x.Id == key);
                    if (_connections.Find(x => x.Id == key) != null)
                    {
                        _connections.Find(x => x.Id == key).ConnectionId.Remove(connectionId);
                        if (_connections.Find(x => x.Id == key).ConnectionId.Count == 0)
                        {
                            _connections.Remove(item);
                        }
                    }
                }
            }
        }
    
    • 在我的中心班
    
    private void IsActive(string connection, bool connected) 
    {
        Clients.All.clientconnected(connection, connected);
    }
    public override Task OnConnected()
    {
        string name = Context.User.Identity.Name;
        _connections.Add(name, Context.ConnectionId);
        IsActive(name, true);
        return base.OnConnected();
    }
    public override Task OnDisconnected(bool stopCalled)
    {
        string name = Context.User.Identity.Name;
        _connections.Remove(name, Context.ConnectionId);
        IsActive(name, false);
        return base.OnDisconnected(stopCalled);
    }
    public override Task OnReconnected()
    {
        string name = Context.User.Identity.Name;
        if (!_connections.GetConnections(name).Contains(Context.ConnectionId))
        {
            _connections.Add(name, Context.ConnectionId);
        }
        IsActive(name, false);
        return base.OnReconnected();
    }
    
  • 在_Layout.cshtml中

    
    // reference scripts
    // add a callback or the OnConnected() Will not fire
    chat.client.clientconnected = function (id,active){
    /*
    this will be called everytime a user connect or disconnect to the hub
    */
    }
    $.connection.hub.start();
    

现在,我可以实时获取所有在线用户。
注意:这是一个InMemory解决方案。其他解决方案在这里

希望这可以帮助...

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用ASP.NET Core MVC获取用户输入

来自分类Dev

使用ASP.NET MVC 6 WebAPI从Auth0获取用户信息

来自分类Dev

ASP.net MVC获取用户从URL检索的特定ID的角色

来自分类Dev

Facebook OAuth登录未在ASP.NET Core 2.2中获取用户配置文件

来自分类Dev

根据使用httpcontext asp.net mvc登录的用户获取时区

来自分类Dev

具有ASP.NET标识的MVC 5-用户登录时获取声明

来自分类Dev

在Asp.Net MVC 5中获取已登录用户的UserID

来自分类Dev

获取ASP.NET Core MVC中当前登录用户的角色

来自分类Dev

ASP.NET MVC4获取登录用户的电子邮件

来自分类Dev

从登录用户获取产品时出错。ASP.NET Core MVC

来自分类Dev

我如何获取登录asp.net mvc的用户的userId或MembershipId

来自分类Dev

获取登录用户角色:Asp.net MVC5

来自分类Dev

如何获取登录到我的ASP.NET MVC网站的当前用户的名称?

来自分类Dev

如何从ASP.NET MVC自定义IdentityUser模型获取用户配置文件数据?

来自分类Dev

如何在ASP Net Core MVC应用程序中从Azure AD B2C获取用户列表?

来自分类Dev

如何根据 ASP.NET MVC 实体框架中的电子邮件地址获取用户的 ID

来自分类Dev

ASP.NET MVC FormsAuthentication检查用户是否登录

来自分类Dev

用户“ sa”的ASP.NET MVC页面登录失败

来自分类Dev

ASP.NET 5 MVC 6-登录用户

来自分类Dev

用户“ sa”的ASP.NET MVC页面登录失败

来自分类Dev

ASP.Net MVC 后端如何知道用户是否登录

来自分类Dev

无法自动登录asp.net MVC

来自分类Dev

验证登录表单ASP.NET MVC

来自分类Dev

ASP.Net MVC登录实践

来自分类Dev

ASP.NET MVC会话状态超时

来自分类Dev

Asp.Net MVC 5模型状态

来自分类Dev

ASP.NET MVC记录状态

来自分类Dev

ASP NET MVC 5会话状态

来自分类Dev

LinqToTwitter用户授权ASP.NET MVC

Related 相关文章

热门标签

归档