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