2015-01-14 1 views
2

Я не очень хорошо знаком с OWIN или ASP.NET, но я создаю сайт на основе шаблона MVC с индивидуальной учетной записью пользователя, и я столкнулся с проблемой с промежуточным программным обеспечением OWIN cookie. Я использую по умолчанию ApplicationSignInManager, как это предусмотрено в шаблоне проекта, и у меня также есть концентратор SignalR для некоторой работы в режиме реального времени. Теперь, в определенных условиях, я хотел бы войти в систему, используя пользовательский концентратор SignalR. Этот код:Получить cookie аутентификации OWIN в SignalR

Get<ApplicationSignInManager>().PasswordSignInAsync(…) 

прекрасно работает в действии контроллера, потому что действие приведет ответ HTTP с Set-Cookie заголовком, который установит .AspNet.ApplicationCookie как ожидалось, и последующие запросы будут содержать его. Поскольку я возвращаю значение из концентратора SignalR, а не контроллера, я бы просто получил cookie и установил его в клиентском методе концентратора, чтобы имитировать ответ контроллера.

Однако я не могу понять, как найти значение cookie.

Я просмотрел в основном все, что есть в IOwinContext, а файл cookie нигде не найден. Я могу найти зарегистрированный в ClaimsIdentity просто отлично, а не печенье, подумал. Я проделал некоторое чтение, и я думаю, причина в том, что промежуточное программное обеспечение, которое фактически устанавливает cookie, еще не выполнено в той точке, где я просматриваю файл cookie. Это может просто не выполняться вообще, поскольку в хабе, я даже не знаю, есть ли я в конвейере OWIN. Я просто делаю это:

HttpContext.Current.GetOwinContext().Get<ApplicationSignInManager>().PasswordSignInAsync() 

Я попытался добавить свой собственный промежуточное программное обеспечение, как это:

app.Use(async (context, next) => { await next; }); 

Но это промежуточное программное обеспечение не попал на все, что заставляет меня думать, получая ApplicationSignInManager в SignalR I я создаю IPrincipal, да, но ничего больше не происходит, а именно выполнение промежуточного программного обеспечения cookie, которое установило бы ответ HTTP Set-Cookie заголовок, которым я пользуюсь.

Есть ли способ разрешить это и зарегистрировать мой пользователь в SignalR, а затем перезапустить соединение на клиенте, чтобы следующий вызов OnConnected получил cookie, который я установил вручную, и выработал правильный IPrincipal? Можно ли вообще запустить конвейер OWIN в концентраторе?

ответ

3

Вы читаете это правильно - cookie не установлен до тех пор, пока не начнется запрос и ответ.

В любом случае, аутентификация cookie всегда задана. Http-only - это означает, что JavaScript не имеет доступа к этому файлу cookie, чтобы предотвратить высокоуровневый сеанс сеанса клиента. И вы пытаетесь установить auth-cookie с помощью JavaScript, которые пахнут проблемами безопасности.

Я бы отказался от этой идеи. Вместо этого войдите в систему с помощью действия контроллера без участия JS, затем выполните работу с SignalR - проще и безопаснее.

+0

Да, теперь я сейчас перерабатываю приложение, чтобы использовать действие контроллера. Имеет смысл, что cookie является HTTP-only, когда я думаю об этом. Жаль, подумал, мне тоже понравилось бы пройти через хаб. Спасибо за Ваш ответ! –