Подтвердить что ты не робот

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.

Кажется, это так просто, поэтому я, возможно, что-то пропустил.

Спасибо,

4b9b3361

Ответ 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 для тестирования каким-то образом вызывает проблему. Однако я не могу объяснить, почему это так.

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