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

Web API 2, аутентификация OWIN, SignOut не выходит из системы

Я делаю некоторые исследования для работы с целью использовать маркеры Bearer в качестве механизма аутентификации (например, пользовательский интерфейс AngularJS, аутентифицируется через OWIN в проекте Web API [2]).

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

Моя конфигурация запуска такова:

OAuthOptions = new OAuthAuthorizationServerOptions() {
    TokenEndpointPath = new PathString("/Token"),
    Provider = new ApplicationOAuthProvider(PublicClientId),
    AccessTokenExpireTimeSpan = SESSION_TIMEOUT,
    AllowInsecureHttp = true
};

И мое действие выхода из системы - это просто:

public HttpResponseMessage Logout() {
    var authentication = HttpContext.Current.GetOwinContext().Authentication;
    authentication.SignOut(DefaultAuthenticationTypes.ExternalBearer);

    return new HttpResponseMessage(HttpStatusCode.OK);
}

Я оставил все данные аутентификации для краткости, но для подтверждения, я использую ExternalBearer при настройке токена.

В моем пользовательском интерфейсе я храню токен в локальном хранилище (здесь не задействованы куки, что является преднамеренным дизайнерским решением). Таким образом, у меня есть кнопка logout в моем пользовательском интерфейсе, действие Выход удалено, и код работает нормально.

Однако, если я впоследствии удалю действие по API, которое требует авторизации, запрос все равно проходит (то есть пользователь все еще проходит проверку подлинности, даже несмотря на то, что он должен быть подписан.

Либо я пропущу что-то действительно очевидное (не будет в первый раз;-) или там что-то более фундаментальное происходит здесь - наконец, я пинговаю @leastprivilege, поскольку я знаю, что это их область.

Любая помощь или понимание будут с благодарностью восприняты.


Единственное, о чем я могу думать, это то, что токен является апатридом на стороне сервера /API и, следовательно, не может быть истек или выписан.

Если это так, я думаю, я мог бы:

a) Добавьте токен обновления, который создает новый токен, который истекает в прошлом - будет ли это работать? - на самом деле отменить это, он выдаст новый токен... старый будет по-прежнему действителен

b) Храните токен-носитель в базе данных и проверяйте каждый раз, удаляя токен при выходе из системы (естественно соленый, хэшированный и т.д.). Однако это просто возвращает нас к созданию сервера с поддержкой состояния.

c) Я могу (и будет) удалять токен из локального хранилища, когда кто-то явно выйдет из системы, однако токен по-прежнему технически корректен, если baddy может перехватить токен. Естественно, что все вышеперечисленное будет превышать SSL, что должно препятствовать плохим парням/девушкам.

d) Возможно, именно поэтому многие люди хранят токен Bearer в cookie (как механизм хранения), поэтому, как только вы выходите из системы, как минимум cookie будет удален при следующем обновлении.

Извините, что это немного свалка мозга, просто желая упредить любые вопросы.

4b9b3361

Ответ 1

Поскольку OAuth не является протоколом проверки подлинности, нет понятия выписки. Удалите токен доступа на клиенте - все, что вы можете сделать.

Если вы хотите аннулировать токен на стороне сервера, добавьте к нему уникальный идентификатор и отслеживайте его в своей службе - вам нужно будет вручную создать что-то подобное.

Ответ 2

У меня есть прекрасное решение здесь: http://www.nakov.com/blog/2014/12/22/webapi-owin-identity-custom-login-service/. Это реализация пользовательского пользовательского сеанса для авторизации маркера на предъявителя веб-API OAuth на основе OWIN и стандартной идентификации ASP.NET(Microsoft.AspNet.Identity.EntityFramework). Он работает так, как может ожидать большинство людей:

  • сеансы веб-API умирают после 30 минут бездействия.
  • Сессионная жизнь продлевается при каждом разрешенном HTTP-запросе с дополнительными 30 минутами.
  • Выход из системы работает корректно: после выхода из системы канал access_token становится недействительным (его отменяют).

Полный рабочий исходный код доступен в GitHub: https://github.com/SoftUni/SPA-with-AngularJS/tree/master/Ads-REST-Services

Ответ 3

Этот вопрос был здесь веками (и ответил тоже), но я только хотел перезвонить в своих мыслях.

Я бы сделал схожую с вашей (C) опцией, но использовал более короткий срок действия токена доступа к каналу доступа как 10 или 20 минут, так что, когда вы вышли из системы и удалили токен на клиенте, хотя технически токен все еще действует, у плохого человека будет только оставшееся время истечения времени, чтобы играть с вашим действительным токеном.

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

Ответ 4

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