在模型中设置用户名而不是javascript代码

时间:2016-06-10 21:47:20

标签: c# asp.net asp.net-mvc signalr

我设法让我的SignalR聊天,我遇到了这个问题。

<script type="text/javascript">
    $(function () {
        // Declare a proxy to reference the hub.
        var chat = $.connection.chatHub;
        // Create a function that the hub can call to broadcast messages.
        chat.client.broadcastMessage = function (name, message) {

            $('#chat-body').append('<li><strong>' + name + ' :</strong> ' + message);

        };

        // Start the connection.
        $.connection.hub.start().done(function () {
            $('#send-chat-msg-btn').click(function () {

                // Call the Send method on the hub.
                chat.server.send('Username', $('#message-input-field').val());

                // Clear text box and reset focus for next comment.
                $('#message-input-field').val('').focus();

            });
        });
    });
</script>

在发送到服务器时,用户名在此javascript代码中设置。

我不希望这样,因为人们可以通过改变他们的名字来假装成其他人。

public class ChatHub : Hub
{
    DatabaseContext db = new DatabaseContext();

    public void Send(string name, string message)
    {
        // Get character
        string Username = User.Identity.GetUserName();
        Character Character = db.Characters.Where(c => c.Name == Username).FirstOrDefault();

        // Call the broadcastMessage method to update clients.
        Clients.All.broadcastMessage(name, message);
    }
}

该名称将发送至此ChatHub
但是我希望在这里设置名称而不是JS代码 但我无法从数据库中获取名称,因为它显示User does not exist in the current context

如何在模型中设置名称,而不是在js代码中设置名称?

谢谢。

1 个答案:

答案 0 :(得分:1)

通常在MVC中,如果您不在控制器中,则需要使用HttpContext.Current.User.Identity。但是,对于集线器来说,这不会正常工作 - 如果你考虑一下,集线器有很多连接,并且不一定在特定用户的HTTP环境下运行。相反,您应该使用HubCallerContext上的用户属性。

请注意,只有在您的集线器配置为使用身份验证时才会填充此项 - 否则服务器无法知道客户端的用户名。见here。如果您使用OWIN进行自托管,则需要在调用MapSignalR之前配置auth模块(请参阅this answer)。