.net 信号器v2 RC1 CORS请求没有使用信号器v2 RC1的cookie

.net 信号器v2 RC1 CORS请求没有使用信号器v2 RC1的cookie,.net,asp.net-mvc-4,cross-domain,signalr,cors,.net,Asp.net Mvc 4,Cross Domain,Signalr,Cors,使用信号器V2 RC1 我有一个signar自托管控制台应用程序,它允许位于绑定到http://*:8080的Server1上的CORS连接 在Server2上,我有一个使用Windows身份验证的MVC4内部网网站 当用户第一次通过Server3上的浏览器点击默认页面时,MVC控制器会分配一个cookie。我希望将此cookie从浏览器传递到Server1上的SignalR应用程序 通过VS2012在本地执行此操作时,我可以清楚地看到浏览器中正在设置cookie,并随后在每个连接上传递给自托管

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

在Server2上,我有一个使用Windows身份验证的MVC4内部网网站

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

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

在上面的服务器上完成后,cookie不再与信号器请求一起发送

这个问题似乎不是IE9特有的(我知道IE9在通过CORS连接传递cookies时有问题),因为我在Firefox上也尝试过同样的结果

我的印象是,关于CORS和Cookie的问题已经为信号机v2 RC1解决。那么我做错了什么

我已经通过将cookie详细信息放入查询字符串中来解决问题,但我更希望通过跨域传递cookie使其正常工作

为了完整性起见,signar自托管应用程序的配置如下所示,尽管我猜这与客户端在发送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();
        });
    });
});

$(函数(){
//设置连接的集线器URL
$.connection.hub.url=”http://10.144.20.150:8080/signalr";
$.connection.hub.qs={'Token':$.cookie(“Token”)};
//声明代理以引用中心。
var chat=$.connection.myHub;
//创建一个中心可以调用以广播消息的函数。
chat.client.addMessage=函数(名称、消息){
//Html编码显示名称和消息。
var encodedName=$('').text(name).html();
var encodedMsg=$('').text(message.html();
//将消息添加到页面。
$(“#讨论”)。追加(“
  • ”+encodedName +“:”+encodedMsg+”
  • ); }; //获取用户名并将其存储到消息前。 $('#displayname').val(提示('输入您的姓名:',''); //将初始焦点设置为消息输入框。 $(“#消息”).focus(); //启动连接。 $.connection.hub.start({withCredentials:true}).done(函数(){ $('#sendmessage')。单击(函数(){ //在集线器上调用Send方法。 chat.server.send($('#displayname').val(),$('#message').val()); //清除文本框并重置下一条注释的焦点。 $('#message').val('.focus(); }); }); });
    Cookie绑定到最初从中返回的域。即使当前提供的页面来自server1.com,浏览器也不会在请求中将cookie从server1.com发送到server2.com。这就是饼干的工作原理。将信息放入查询字符串中是正确的方法。

    Damian,谢谢。我以为我要发疯了。但我必须从根本上误解CORS应该实现什么。我理解cookies和Ajax连接到其他域的限制,因为从那时起,几乎永远都是这样。但据我所知,CORS应该缓解这种情况,或者特别是应该绕过传递cookies的问题?如果不是这样的话,我有点困惑github补丁修复了什么。CORS允许浏览器从一个域的上下文向另一个域发出通常不允许的特定请求类型。例如,默认情况下不允许向其他域发送Ajax请求,除非浏览器和服务器都通过CORS同意。