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.
Кажется, это так просто, поэтому я, возможно, что-то пропустил.
Спасибо,
Ответы
Ответ 1
У меня была аналогичная проблема за последние несколько дней. Вместо
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);
В этой статье объясняется, почему ваши файлы cookie не удаляются: http://dotnet.dzone.com/articles/catching-systemwebowin-cookie
Я знаю, что мой ответ не самый основанный на исследованиях, но, честно говоря, я просто не мог найти ПОЧЕМУ мои приведенные примеры кода работают для меня. Я просто знаю, что System.Web испортит файлы cookie Owins, если вы используете SignOut() другим способом.
Ответ 2
Другие варианты не помогли мне, однако я смог решить эту проблему, выполнив следующие действия.
В файле Startup.cs вы можете установить способ сохранения файла cookie:
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = "ExternalCookie",
AuthenticationMode = AuthenticationMode.Passive,
CookieName = ".AspNet.SomeName",
ExpireTimeSpan = TimeSpan.FromMinutes(5)
});
В приведенном выше примере кода вы можете указать имя файла cookie на ".AspNet.SomeName".
Теперь вы можете уничтожить его, просто установив срок действия файлов cookie на прошлую дату:
if (HttpContext.Current.Request.Cookies[".AspNet.SomeName"] != null)
{
HttpCookie myCookie = new HttpCookie(".AspNet.SomeName");
myCookie.Expires = DateTime.Now.AddYears(-1);
HttpContext.Current.Response.Cookies.Add(myCookie);
}
Ответ 3
Это сработало для меня. Бросьте его в контроллер, если вы хотите аннулировать файл cookie. В частности, я использовал это для обновления пользовательских ролей, чтобы пользователю не приходилось вручную вручную выходить из системы и снова входить, чтобы исправить меню, загружаемое в @if(User.IsInRole("Admin")){...}
. Надеюсь, это поможет кому-то - мне потребовалось некоторое время, чтобы понять это.
var updatedUser = await UserManager.FindByNameAsync(User.Identity.Name);
var newIdentity = await updatedUser.GenerateUserIdentityAsync(UserManager);
AuthenticationManager.SignOut();
AuthenticationManager.SignIn(newIdentity);
Ответ 4
Я следил за всем решением выше, но я смутился в конце, потому что пользователь не выходил из системы. Наконец, моя проблема решена:
Request.GetOwinContext().Authentication.SignOut(DefaultAuthenticationTypes.ApplicationCookie);
FederatedAuthentication.SessionAuthenticationModule.SignOut();
Поскольку я использовал SessionAuthenticationModule
для сохранения претензий в нем, то после выхода из системы пользователь мог использовать приложение из-за существующего FedAut в файлах cookie.
Ответ 5
AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie);
FormsAuthentication.SignOut();
Session.Abandon();
Ответ 6
Об отключении ASP.Net MVC не работает: -
У меня была проблема, когда приложение, размещенное на IIS в производственных режимах, не работало с хромом
хотя он работал правильно
- использование хостинга Visual Studio Dev во всех браузерах
- в режиме производства через IE
У меня были проблемы с Startup.Auth.CS.
Удостоверьтесь, что дублирующие конфигурации не существуют для следующих вещей.
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
app.UseCookieAuthentication((new CookieAuthenticationOptions(.....))
Ответ 7
В последние несколько дней у меня была похожая проблема с некоторыми образцами Microsoft Azure.
Решено с помощью:
public IHttpActionResult Index()
{
HttpContext.Current.GetOwinContext().Authentication.SignOut(
CookieAuthenticationDefaults.AuthenticationType,
OpenIdConnectAuthenticationDefaults.AuthenticationType);
return Ok();
}
Ответ 8
Я получил это, чтобы работать. Вот что я сделал:
Когда я вызвал действие 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 для тестирования каким-то образом вызывает проблему. Однако я не могу объяснить, почему это так.
Спасибо за чтение.