我有一个正在运行的.NET网站,其身份验证已启动并正在运行(Identity 2.0通过Owin& https://identityazuretable.codeplex.com/)
我想使用websockets主要用于SignalR传输,但由于域运行在cloudflare上(免费计划目前不支持websockets)我不能在同一个域上使用SignalR并获得websockets。因此,要解决此问题,我有一个子域websockets.example.com,它不使用cloudflare,但确实指向同一个应用程序。
但是,我现在希望根据Cookie中的表单身份验证令牌来验证SignalR连接。但是,当我执行以下操作时,或者当SignalR连接到websockets.example.com
时,cookie不会被发送JQuery请求:
$.ajax({
url: "//websockets.example.com/signalr/hubs",
type: "POST",
xhrFields: {
withCredentials: true
}
});
或者:
$.connection.hub.url = '//websockets.example.com/signalr/';
$.connection.hub.start({ withCredentials: true });
接头:
Accept:*/*
Accept-Encoding:gzip,deflate
Accept-Language:en-GB,en-US;q=0.8,en;q=0.6
Connection:keep-alive
Content-Length:0
Cookie:ARRAffinity=805c328533b85a33c6fdeb4870bd41f00e05fd898b5d784f2635656f9525466b
Host:websockets.example.com
Origin:http://example.com
Referer:http://example.com/Page
响应:
Access-Control-Allow-Credentials:true
Access-Control-Allow-Origin:https://example.com
编辑:Owin配置:
app.Map("/signalr", map =>
{
map.UseCors(new CorsOptions
{
PolicyProvider = new CorsPolicyProvider
{
PolicyResolver = context =>
{
var corsPolicy = new CorsPolicy
{
AllowAnyHeader = true,
AllowAnyMethod = true,
SupportsCredentials = true,
AllowAnyOrigin = false,
};
corsPolicy.Origins.Add("http://example.com");
corsPolicy.Origins.Add("http://www.example.com");
corsPolicy.Origins.Add("http://websockets.example.com");
corsPolicy.Origins.Add("https://websockets.example.com");
corsPolicy.Origins.Add("https://example.com");
corsPolicy.Origins.Add("https://www.example.com");
return Task.FromResult(corsPolicy);
}
}
});
map.RunSignalR();
});
答案 0 :(得分:2)
我认为您的问题与您的身份验证Cookie的设置方式有关。这可以解释为什么cookie不会通过SignalR发送到websockets.example.com或通过jQuery.ajax
发送的正常CORS请求。
要确保将父域设置的cookie发送到子域,您需要使用Set-Cookie标头显式定义域:
Set-Cookie: name=value; domain=.mydomain.com
如果您没有明确定义域,则只会将Cookie发送回设置它们的完全域。
http://erik.io/blog/2014/03/04/definitive-guide-to-cookie-domains/ https://stackoverflow.com/a/23086139/719967