使用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>: ' + 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();
});
});
});
答案 0 :(得分:0)
Cookie与最初返回的域绑定在一起。即使当前提供的页面来自server1.com,浏览器也不会向server2.com发送来自server1.com的cookie。这就是cookie的工作原理。将信息放在查询字符串中是正确的方法。
答案 1 :(得分:0)
此sample使用CORS和SignalR(selfhost或webhost)服务器生成的cookie。