Настройка FormsAuthentication после аутентификации SSO
Приложение ASP.NET MVC 4 защищено системой единого входа (OAM) с фильтром ISAPI, работающим на IIS. Когда запрос к моему приложению получен, он перехватывается фильтром ISAPI и перенаправляется на SSO. Пользователь должен войти в систему единого входа, после чего он возвращается в мое приложение.
Имя пользователя аутентифицированного пользователя (через SSO) совместно с моим приложением в заголовках HTTP-запросов.
Request.Headers["username"]
То, что я пытаюсь достичь,- после аутентификации SSO, настройка FormsAuthentication
в моей заявке на username = Request.Headers["username"]
, Таким образом, SSO остается прозрачным для моего приложения, и личность пользователя доступна в объекте HttpContext, плюс я (разработчик) мог бы эффективно использовать атрибут Authorize для определенных ролей.
Чтобы добиться этого, я подключаюсь к Session_Start()
, читать Request.Headers["username"]
, Задавать FormsAuthentication
печенье. И я получаю этот SSO-пользователь Forms-Authenticated для моего приложения.
Но моя проблема в том, когда я выхожу из системы (FormsAuthentication.Signout
), Я перенаправляю его на другую страницу внутри приложения, которая запускает новый сеанс (я вижу запуск Session_Start, когда это происходит)
Правильно ли я делаю - FormsAuthentication после SSO? И если нет, то почему, а затем, как я могу сообщить своему приложению о пользователе, прошедшем аутентификацию SSO?
2 ответа
Мне пришлось явно убить сеанс внутри Session_Start, если запрошенный URL-адрес URL-адрес выхода из системы. И затем со следующим запросом (например, из выхода из системы на страницу входа снова), он генерирует новый сеанс и работает без сбоев.
protected void Session_Start()
{
if (!Request.IsAuthenticated && !IsSignoutURL)
AcceptSessionRequest(); //process local authentication
else if (IsSignoutURL)
RejectSessionRequest(); //kill the sessions
}
Чтобы узнать, как SSO передает идентификационные данные аутентифицированного пользователя моему приложению, прочитайте мой комментарий к посту tvanfosson.
Пост остается открытым для лучшей идеи.
Разумно использовать cookie-файлы FormsAuthentication для отслеживания вошедшего в систему пользователя в вашем приложении после того, как они были аутентифицированы с помощью поставщика единого входа. Вы не показываете это, но я надеюсь, что вы также получаете какой-то билет, который вы можете использовать для проверки вошедшего пользователя вне диапазона с провайдером SSO, а не просто доверять username
заголовок.
Однако вы можете видеть, что пользователь не вышел из поставщика единого входа, когда вы выходите из приложения. Из-за этого, пока у них есть действительный файл cookie для поставщика единого входа, они будут оставаться в системе, т. Е. Пользователь будет автоматически возвращаться к вашему приложению от поставщика единого входа без какой-либо необходимой аутентификации.
Это прискорбно, но нормально.
Если вы действительно хотите, чтобы пользователь вышел из системы, вам необходимо использовать функцию централизованного выхода из системы. Я не работал с OAM, но, похоже, он поддерживает это: http://docs.oracle.com/cd/E21764_01/doc.1111/e15478/logout.htm