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