首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >跨域SignalR认证

跨域SignalR认证
EN

Stack Overflow用户
提问于 2014-11-25 18:23:05
回答 1查看 3.3K关注 0票数 3

我有一个运行良好的.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请求:

代码语言:javascript
复制
$.ajax({
   url: "//websockets.example.com/signalr/hubs",
   type: "POST",
   xhrFields: {
         withCredentials: true
   }
});

或者:

代码语言:javascript
复制
$.connection.hub.url = '//websockets.example.com/signalr/';
$.connection.hub.start({ withCredentials: true });

标题:

代码语言:javascript
复制
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

响应:

代码语言:javascript
复制
Access-Control-Allow-Credentials:true
Access-Control-Allow-Origin:https://example.com

编辑: Owin Config:

代码语言:javascript
复制
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();
            });
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-26 22:44:06

我认为您的问题在于身份验证cookie的设置方式。这将解释为什么cookie不通过SignalR发送到SignalR,或者不通过jQuery.ajax发送普通的CORS请求。

为了确保父域设置的Cookie被发送到子域,您需要使用Set-Cookie头显式地定义域:

代码语言:javascript
复制
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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27133947

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档