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 при настройке токена.
В моем пользовательском интерфейсе я храню токен в локальном хранилище (здесь не используются файлы cookie, что является преднамеренным дизайнерским решением). Итак, у меня естьвыйти кнопка на моем интерфейсеВыйти действие ударил и код работает нормально.
Однако, если я впоследствии выполню действие в API, которое требует авторизации, запрос все равно будет выполнен (т.е. пользователь все еще аутентифицирован, даже если ондолжен были выписаны.
Либо я упускаю что-то действительно очевидное (не в первый раз ;-), либо здесь происходит нечто более фундаментальное - наконец-то я пингую @leastprivilege, поскольку знаю, что это их область.
Любая помощь или понимание будут с благодарностью приняты.
Единственное, о чем я могу думать, это то, что токен не имеет состояния на стороне сервера / API и, следовательно, не может быть просрочен или завершен.
Если это так, думаю, я мог бы либо:
a) Добавьте токен обновления, который создает новый токен, срок действия которого истекает в прошлом. Будет ли это работать? - на самом деле отмените это, он выдаст новый токен ... старый будет по-прежнему действителен
б) Храните токен на предъявителя в базе данных и проверяйте каждый раз, удаляя токен при выходе из системы (естественно соленый, хэшированный и т. д.). Однако это только возвращает нас к серверу с состоянием.
c) Я могу (и буду) удалять токен из локального хранилища, когда кто-то явно выйдет из системы, однако токен все еще технически действителен, еслиплохой может перехватить токен. Естественно все вышеперечисленное закончитсяSSL во всяком случае, что должно препятствоватьплохие парни / девушки.
d) Возможно, именно поэтому многие люди хранят токен Bearer в cookie (как механизм хранения), поэтому, как только вы выйдете из системы, как минимум, cookie будет удален при следующем обновлении.
Извините, вышесказанное - это просто мозговая утечка, просто хочу предупредить любые вопросы