我可以在SignalR消息中使用Asp.Net应用程序用户吗?

时间:2016-07-03 13:15:35

标签: asp.net-mvc signalr

您好,我从ASP.net用户之间的私人消息开始,使用SignalR,一切正常如果我使用ConnectionId - s,这样我就可以接收收件人的ConnectionId并向此人发送私人消息。现在关于问题,我希望在数据库中存储消息并在登录时加载它们,我正在使用ASP.net mvc5应用程序的标准成员资格,因此在重新连接后ConnectionId正在改变。我正在阅读文章Mapping SignalR Users to Connections,但我无法理解如何使用IUserProvider你能解释我如何制作这个节目。非常感谢。 这是我的集线器代码:

[HubName("chatHub")]
public class ChatHub : Hub
{

    static List<ApplicationUser> Users = new List<ApplicationUser>();
    private ApplicationDbContext db = new ApplicationDbContext();

    public void Send(string name, string message)
    {
        Clients.All.addMessage(name, message);
    }


    public void SendPM(string name, string privatemessage, string userid)
    {
       //This line not Works I've commented it but filling It's correct way
       //Clients.User(userid).addPM(name, privatemessage);   
       Clients.Client(userid).addPM(name, privatemessage);
    }

    public void Connect(string userName)
    {
        var id = Context.ConnectionId;
        var appuser = db.Users.FirstOrDefault(x => x.UserName == userName);
        var dbUsers = db.Users.ToList();

        if (!Users.Any(x => x.ConnectionId == id))
        {
            Users.Add(new ApplicationUser { ConnectionId = id, UserName = userName, Id = appuser.Id });


            Clients.Caller.onConnected(id, userName, Users);


            Clients.AllExcept(id).onNewUserConnected(id, userName);
        }
    }


    public override System.Threading.Tasks.Task OnDisconnected(bool stopCalled)
    {
        var item = Users.FirstOrDefault(x => x.ConnectionId == Context.ConnectionId);
        if (item != null)
        {
            Users.Remove(item);
            var id = Context.ConnectionId;
            Clients.All.onUserDisconnected(id, item.UserName);
        }

        return base.OnDisconnected(stopCalled);
    }
}

1 个答案:

答案 0 :(得分:1)

文章说:

  

默认情况下,会有一个实现使用用户的IPrincipal.Identity.Name作为用户名。

这意味着要使映射起作用,您需要让用户在调用SignalR hub时登录(授权)用户。确保这一点的最简单方法是将[Authorize]属性添加到ChatHub以及返回聊天视图的控制器。

如果用户已获得授权,您可以通过调用以下方式从当前上下文中检索其用户名:

   var username = Context.User.Identity.Name;

然后,以下内容应该有效(无需提供您自己的IUserIdProvider):

public void SendPM(string name, string privatemessage, username)
{
   Clients.Client(username).addPM(name, privatemessage);
}