OWIN – Authentication.SignOut (), похоже, не удаляет файл cookie

У меня возникли проблемы с аутентификацией OWIN Cookie. У меня есть сайт .Net, на котором есть некоторые страницы MVC, которые используют аутентификацию файлов cookie и ресурсы WebAPI, защищенные маркером-носителем.

Когда я выхожу из системы, я удаляю токен доступа на клиенте, поэтому последующие запросы API не будут иметь токен в заголовке и, таким образом, не смогут выполнить аутентификацию. Эта часть в порядке.

Таким же образом я также хотел бы выйти из системы, чтобы удалить файл cookie, используемый страницами MVC. На сервере я сделал следующее:

[Route("Logout")] public IHttpActionResult Logout() { var ctx = Request.GetOwinContext(); var authenticationManager = ctx.Authentication; authenticationManager.SignOut(); return Ok(); } 

Однако после вызова Logout я все равно могу попасть на защищенную страницу MVC, хотя cookie предположительно был бы удален при вызове Logout.

Кажется, это так просто, поэтому я мог что-то пропустить.

Благодаря,

    У меня была аналогичная проблема за последние несколько дней. Вместо

     Request.GetOwinContext().Authentication.authenticationManager.SignOut(); 

    Используйте ОДИН (и только один) из них:

     Request.GetOwinContext().Authentication.SignOut(); Request.GetOwinContext().Authentication.SignOut(Microsoft.AspNet.Identity.DefaultAuthenticationTypes.ApplicationCookie); HttpContext.Current.GetOwinContext().Authentication.SignOut(Microsoft.AspNet.Identity.DefaultAuthenticationTypes.ApplicationCookie); 

    В этой статье объясняется, почему ваши cookies не удаляются: http://dotnet.dzone.com/articles/catching-systemwebowin-cookie

    Я знаю, что мой ответ не самый основанный на исследованиях, но, честно говоря, я просто не мог найти ПОЧЕМУ мои приведенные примеры кода работают для меня. Я просто знаю, что System.Web испортит cookies Owins, если вы используете SignOut () другим способом.

    Это сработало для меня. Бросьте его в controller, если вы хотите аннулировать файл cookie. В частности, я использовал это для обновления ролей пользователя, чтобы пользователю не приходилось вручную вручную выходить из системы и снова входить, чтобы исправить меню, загружаемое в @if(User.IsInRole("Admin")){...} . Надеюсь, это помогает кому-то – мне понадобилось время, чтобы понять это.

      var updatedUser = await UserManager.FindByNameAsync(User.Identity.Name); var newIdentity = await updatedUser.GenerateUserIdentityAsync(UserManager); AuthenticationManager.SignOut(); AuthenticationManager.SignIn(newIdentity); 

    Я следил за всем выше решением, но я смутился в конце, потому что пользователь не вышел из системы. Наконец, моя проблема решена:

     Request.GetOwinContext().Authentication.SignOut(DefaultAuthenticationTypes.ApplicationCookie); FederatedAuthentication.SessionAuthenticationModule.SignOut(); 

    Поскольку я использовал SessionAuthenticationModule для хранения претензий в нем, то после выхода из системы пользователь может использовать приложение из-за существующего FedAut в файлах cookie.

      AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie); FormsAuthentication.SignOut(); Session.Abandon(); 

    О выходе ASP.Net MVC не работает: –

    У меня была проблема, когда приложение, размещенное на IIS в производственных режимах, не работало правильно с хромом

    хотя он работал правильно, пока – используя хостинг Visual Studio Dev во всех браузерах – в режиме производства через IE

    У меня были проблемы с Startup.Auth.CS. Удостоверьтесь, что дублирующих конфигураций не существует для следующих вещей

      app.CreatePerOwinContext(ApplicationUserManager.Create); app.UseCookieAuthentication((new CookieAuthenticationOptions(.....)) 

    Я получил это, чтобы работать. Вот что я сделал:

    Когда я назвал действие Logout выше, я использовал Fiddler, поскольку я все еще тестировал функцию выхода из системы. Я поставил точку останова внутри и да, метод успешно вызван. Он вызывает authenticationManager.SignOut (), однако моя защищенная страница все еще работает.

    Поэтому вместо использования Fiddler я решил поместить код в клиент:

      var token = sessionStorage.getItem(tokenKey); var headers = {}; if (token) { headers.Authorization = 'Bearer ' + token; } $.ajax({ type: 'POST', url: '/api/Account/Logout', headers: headers }).done(function (data) { self.result("Logout Done!"); }).fail(showError); 

    Проводка этого кода до кнопки Logout и voila! На защищенной странице MVC теперь появляется ожидаемая ошибка 401 Unauthorized после нажатия кнопки «Выход». Как обычно, ресурс WebAPI также имеет ожидаемую ошибку 401.

    Он работает в конце концов, я думаю, что процесс использования Fiddler для тестирования каким-то образом вызывает проблему. Однако я не могу объяснить, почему это так.

    Спасибо за прочтение.

    Давайте будем гением компьютера.