Выход из системы с помощью AspNet.Security.OpenIdConnect.Server (ASP.NET vNext)

Я использую Visual Studio 2015 Enterprise и ASP.NET vNext Beta8 для выдачи и использования токенов JWT, как описано здесь.

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

Мой вопрос: каковы наилучшие методы выхода из системы с OIDC?

Хотя для этой цели я мог использовать свой собственный контроллер, я не мог не заметить, что Open ID Connect (OIDC), кажется, в какой-то степени готов справиться с этим случаем. Например, у ODC есть обработчик OnLogoutEndpoint и настройки LogoutEndpointPath. Но когда я вызываю URI выхода OIDC, этот обработчик, кажется, принимает любую случайную форму x-www-form-urlencoded, которую я бросаю в него, и, похоже, никоим образом не требует наличия токена.

Будем очень признательны за любые советы по правильному выходу из системы OIDC.


person 42vogons    schedule 24.11.2015    source источник


Ответы (1)


В AspNet.Security.OpenIdConnect.Server логика, используемая для конечной точки выхода, оставлена ​​в качестве упражнения.

В этом sample, он реализован с использованием контроллера MVC 6, где вы, конечно же, можете добавить собственную логику для удаления кэшированных данных с вашего сервера Redis.

[HttpPost("~/connect/logout")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Logout() {
    // When invoked, the logout endpoint might receive an unauthenticated request if the server cookie has expired.
    // When the client application sends an id_token_hint parameter, the corresponding identity can be retrieved using AuthenticateAsync.
    var identity = await HttpContext.Authentication.AuthenticateAsync(OpenIdConnectServerDefaults.AuthenticationScheme);

    // Remove the cached details here. If you need to determine
    // who's the authenticated user, you can use the identity variable.

    // Remove the authentication cookie and return the user to the client application.
    return SignOut("ServerCookie", OpenIdConnectServerDefaults.AuthenticationScheme);
}

Вы также можете сделать что-то подобное прямо из события LogoutEndpoint. Не забудьте вызвать context.HandleResponse(), чтобы убедиться, что запрос не перехвачен другим промежуточным ПО.

person Kévin Chalet    schedule 02.12.2015
comment
спасибо - просто из любопытства, если я использую событие LogoutEndpoint, почему это событие конечной точки ожидает форму или, что более важно, что ожидается в этой форме? - person 42vogons; 09.12.2015
comment
Использование запроса/формы POST не является обязательным, вы также можете использовать один запрос GET. Я использовал здесь форму, потому что хотел добавить поддержку анти-XSRF в конечную точку выхода, чтобы предотвратить нежелательный выход из системы (синдром супервыхода). В качестве альтернативы вы также можете использовать для этого id_token_hint: github.com/aspnet-contrib/AspNet.Security.OpenIdConnect.Server/ - person Kévin Chalet; 09.12.2015
comment
(К вашему сведению: начиная со следующей бета-версии мы прекратим использование токенов доступа JWT по умолчанию и вернемся к непрозрачным токенам. См. github.com/aspnet-contrib/AspNet.Security.OpenIdConnect.Server/ для получения дополнительной информации) - person Kévin Chalet; 09.12.2015
comment
Хорошо, учитывая, что мы вызываем app.UseJwtBearerAuthentication, будет ли наша реализация OIDC функционировать как есть или нам нужно будет повернуть некоторые дополнительные ручки, чтобы она работала с токенами JWT? - person 42vogons; 09.12.2015
comment
При переходе на бета-версию 5 ваше приложение перестанет работать, если вы его не исправите. Для включения токенов JWT потребуется только строка кода в делегате конфигурации. Тем не менее, рекомендуемым подходом будет переход на наше новое промежуточное ПО для проверки/самоанализа. - person Kévin Chalet; 09.12.2015
comment
Отлично, спасибо за наводку. Тем временем другой вопрос OIDC для вас здесь< /а>. - person 42vogons; 10.12.2015
comment
Эй, @Pinpoint - я прочитал вашу проблему 99. Следуя рекомендации, я могу подключиться к событию LogoutEndpoint, вызвать GET/w заголовок авторизации и получить токен через context.HttpContext.Authentication.AuthenticateAsync(Bearer). Я также могу вызвать его с помощью POST, используя форму и id_token_hint, установленный на мой токен в кодировке base-64 (без заголовка авторизации), но тогда context.HttpContext.Authentication.AuthenticateAsync(Bearer) просто возвращает null. Я неправильно понял, каким должен быть id_token_hint? - person 42vogons; 10.12.2015
comment
Ах да, схема изменилась с момента написания поста. Теперь вам нужно использовать константу OpenIdConnectServerDefaults.AuthenticationScheme. Также обратите внимание, что вы должны использовать id_token, который вы получили в ответе авторизации/токена, а не токен доступа. - person Kévin Chalet; 10.12.2015
comment
Хорошо, теперь я понимаю - я должен предоставить id_token, который был получен в ответе на авторизацию/токен. Любопытно, что ответ, который я получаю от OIDC, не выглядит так, я возвращаю только token_type, access_token и expires_in. Я уверен, что это связано с описанной вами OpenIdConnectServerDefaults.AuthenticationScheme, но не знаете, где ее использовать? - person 42vogons; 10.12.2015
comment
Очень маловероятно. По умолчанию сервер OIDC будет возвращать токен идентификации только в том случае, если вы включите openid в параметр области действия. - person Kévin Chalet; 10.12.2015
comment
Спасибо, @Pinpoint - заработало на POST. В интересах всех, кто читает это: Включив openid для ключа области, когда я запрашиваю токен, я получаю ответ, который включает id_token. Затем я могу вызвать конечную точку выхода из своей конечной точки, указав вышеупомянутый id_token в параметре id_token_hint формы выхода. В моем обработчике событий LogoutEndpoint я могу получить свой идентификатор, вызвав var Principal = await context.HttpContext.Authentication.AuthenticateAsync(OpenIdConnectServerDefaults.AuthenticationScheme), выполнить выход из системы, а затем context.HandleResponse() в конце. - person 42vogons; 10.12.2015