SIgnalR v2 RC1 CORS请求没有使用SignalR v2 RC1的cookie

时间:2013-09-19 11:01:54

标签: .net asp.net-mvc-4 cross-domain signalr cors

使用SignalR V2 RC1 我有一个SignalR自托管控制台应用程序,允许位于Server1上的CORS连接绑定到http:// *:8080。

在Server2上我有一个使用Windows身份验证的MVC 4内部网站。

当用户首次通过Server3上的浏览器访问默认页面时,MVC控制器会分配一个cookie。我希望这个cookie从浏览器传递到Server1上的SignalR应用程序。

当通过VS2012在本地执行此操作时,我可以清楚地看到在浏览器中设置的cookie,然后在每个连接上传递给自托管应用程序(在VS2012的另一个实例中运行)。

在上述服务器上完成后,不再使用SignalR请求发送cookie。

这个问题似乎并不特定于IE9(我知道IE9在根据SignalR IE9 Cross Domain request don't work通过CORS连接传递cookie时出现问题),因为我也尝试使用Firefox,结果相同。

我在https://github.com/SignalR/SignalR/issues/1735的印象中认为已经为SignalR v2 RC1解决了有关CORS和Cookie的问题。我做错了什么?

我已经通过将cookie详细信息放入查询字符串来实现一种解决方法,但我希望通过将cookie传递到域中来使其正常工作。

为了完整性,SignalR自托管应用程序配置如下,但我猜这与发送cookie方面客户端的情况无关

public class StartupSignalR
 {
        public void Configuration(IAppBuilder app)
        {
            app.Map("/signalr", map =>
            {
                map.UseCors(CorsOptions.AllowAll);

                var hubConfiguration = new HubConfiguration
                {
                    EnableJSONP = true
                };

                map.RunSignalR(hubConfiguration);
            });
        }
 }

客户端js如下

<script src="Scripts/jquery-1.8.2.min.js"></script>
<!--Reference the SignalR library. -->
<script src="Scripts/jquery.signalR-2.0.0-rc1.min.js"></script>
<!--Reference the autogenerated SignalR hub script. -->
<script src="http://10.144.20.150:8080/signalr/hubs"></script>
<!--Add script to update the page and send messages.-->
<script src="Scripts/jquery.cookie.js"></script>
<script type="text/javascript">
$(function () {
    //Set the hubs URL for the connection
    $.connection.hub.url = "http://10.144.20.150:8080/signalr";
    $.connection.hub.qs = { 'Token': $.cookie("Token") };
    // Declare a proxy to reference the hub.
    var chat = $.connection.myHub;

    // Create a function that the hub can call to broadcast messages.
    chat.client.addMessage = function (name, message) {
        // Html encode display name and message.
        var encodedName = $('<div />').text(name).html();
        var encodedMsg = $('<div />').text(message).html();
        // Add the message to the page.
        $('#discussion').append('<li><strong>' + encodedName
            + '</strong>:&nbsp;&nbsp;' + encodedMsg + '</li>');
    };
    // Get the user name and store it to prepend to messages.
    $('#displayname').val(prompt('Enter your name:', ''));
    // Set initial focus to message input box.
    $('#message').focus();
    // Start the connection.
    $.connection.hub.start({withCredentials:true}).done(function () {
        $('#sendmessage').click(function () {
            // Call the Send method on the hub.
            chat.server.send($('#displayname').val(), $('#message').val());
            // Clear text box and reset focus for next comment.
            $('#message').val('').focus();
        });
    });
});

2 个答案:

答案 0 :(得分:0)

Cookie与最初返回的域绑定在一起。即使当前提供的页面来自server1.com,浏览器也不会向server2.com发送来自server1.com的cookie。这就是cookie的工作原理。将信息放在查询字符串中是正确的方法。

答案 1 :(得分:0)

sample使用CORS和SignalR(selfhost或webhost)服务器生成的cookie。