2014-11-25 3 views
1

У меня есть рабочий сайт .NET с аутентификацией и работают (Идентичность 2.0 через Owin & https://identityazuretable.codeplex.com/)Междоменного SignalR Аутентификация

Я хотел бы использовать WebSockets в первую очередь для транспортировки SignalR, а потому, что домен работает на cloudflare (бесплатный план в настоящее время не поддерживает веб-порты). Я не могу использовать SignalR в том же домене и получать веб-узлы. Поэтому, чтобы обойти эту проблему, у меня есть субдомен websockets.example.com, который не использует cloudflare, но указывает на то же приложение.

Однако теперь я хочу аутентифицировать соединения SignalR на основе их токена аутентификации форм в файле cookie. Однако куки не присылают, когда я ниже, или когда SignalR подключается к websockets.example.com

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 

EDIT: Owin Config:

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

пытаются добавить к ответу: Access-Control-Allow-Methods: * Access-Control-Allow-Headers: * –

+0

@MajoB Я не думал об этом, но мой Owin конфигурации должен делать это ... – Spike

ответ

2

Я думаю, что ваш вопрос с тем, как ваш печенье аутентификации установлен. Это объясняет, почему cookie не отправляется на websockets.example.com через SignalR или обычный запрос CORS, сделанный через jQuery.ajax.

Чтобы печенье, установленные в родительском домене отправляются submdomains вам необходимо явно определить домен с заголовком Set-Cookie:

Set-Cookie: name=value; domain=.mydomain.com 

Если вы явно не определить домен, печенье будет только быть отправлен обратно в точный домен, который их установил.

http://erik.io/blog/2014/03/04/definitive-guide-to-cookie-domains/ https://stackoverflow.com/a/23086139/719967

+0

Звучит неплохо - на самом деле я закончил работу над использованием состояния вызывающего абонента SignalRs (в качестве страницы, загружающей нагрузки signalR из домена, где работает аутентификация). – Spike

Смежные вопросы