Настройка 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

Другие вопросы по тегам