SessionId изменяется при входе в систему с IDP - PullRequest
0 голосов
/ 20 апреля 2020

Я работаю с устаревшим кодом для исправления ошибки, связанной с перенаправлением входа в систему. Короче говоря, когда пользователь загружает страницу, которая имеет ссылку на страницу входа в систему, нажимает на ссылку входа в систему, которая переходит на нашу страницу входа в систему единого входа, а затем входит в систему на этой странице единого входа, они не перенаправляются на домашнюю страницу вместо на странице они были наконец. Исследуя это, способ, которым предыдущие разработчики решили это, заключался в том, чтобы сохранить «глубокую ссылку» как переменную в данных сеанса (у которых идентификатор сеанса сохранен в файле cook ie на клиенте и в памяти на сервере). Теоретически, при входе в систему пользователь должен получить эту глубокую ссылку из данных сеанса, а затем он должен быть перенаправлен. Однако именно здесь обнаруживается проблема: идентификатор сеанса во втором вызове (когда пользователь входит в систему) имеет другой идентификатор сеанса, и, таким образом, соответствующая глубокая ссылка не найдена среди данных сеанса этого идентификатора сеанса.

Я могу доказать, что идентификатор сеанса правильно хранится в cook ie в Chrome и SAML Tracer, а вызовы SAML происходят последовательно, и между ними не происходит никаких других вызовов. Я не вижу, чтобы идентификатор сеанса передавался в параметрах или заголовках http (хотя правильная ссылка, с которой пользователь должен go войти в систему, передается в качестве реферера в первом запросе SSO).

Я должен Также обратите внимание, что мы используем библиотеку SAML в ComponentSpace. Кроме того, при первом вызове go на странице единого входа появляется ошибка 302 Обнаружено, когда это перенаправлено. Я думаю, что это намеренно, но я не уверен на 100%. Единый вход - это ADFS.

Никто, кто работал над этим кодом, больше не работает в компании, и эта база кода, и эти библиотеки являются новыми для меня. Я также не уверен, является ли это проблемой с этим приложением или пользовательским веб-сайтом единого входа, к которому мы подключаемся, и мне нужно доказать это так или иначе. Ни один из нашего кода, касающегося этой проблемы, не изменялся в течение 2 или более лет в соответствии с TFS.

Мои вопросы:

  1. Почему идентификатор сеанса изменяется с первого вызова на второй ?
  2. Требуется ли дополнительная настройка для сохранения данных сеанса от вызова к вызову? Разве я не хочу разные идентификаторы сеанса для разных вызовов в целом?
  3. Как сохраняется сеанс для одного пользователя?
  4. Как мне доказать, является ли проблема изменением нашего приложения или того, к которому мы подключаемся?

Вот код первого вызова SSO, когда пользователь нажимает на ссылку для входа на страницу:

public ActionResult SingleSignOn()
    {
        try
        {
            if (!string.IsNullOrEmpty(ssoUrl))
            {
                _accountRespository.SetDeepLink();
                var sessionId = System.Web.HttpContext.Current.Session.SessionID;
                // Redirect to SSO Site. Reentry point is Controllers/SAMLController.cs::AssertionConsumerService() .
                return Redirect(ssoUrl);

Вот код второго вызова после нажатия кнопки входа в систему со своими учетными данными:

[HttpPost]
    public ActionResult AssertionConsumerService()
    {
        try
        {
            bool isInResponseTo = false;
            string partnerIdP = null;
            string userName = null;
            IDictionary<string, string> claims = null;
            string relayState = null;
            var sessionId = System.Web.HttpContext.Current.Session.SessionID;
            SAMLServiceProvider.ReceiveSSO(Request, out isInResponseTo, out partnerIdP, out userName, out claims, out relayState);

            // Resolve the page redirect.
            if (string.IsNullOrWhiteSpace(relayState))
            {
                // If relayState is not provided by ADFS, get it from the session variable.
                relayState = _accountRepository.GetDeepLink();
                _accountRepository.ClearDeepLink();

                if (string.IsNullOrWhiteSpace(relayState))
                {
                    // If no target URL is provided, default back to the home page.
                    relayState = "~/";
                }
            }

Вот код для вызовов SetDeepLink и GetDeepLink:

public string GetDeepLink()
    {
        var httpContext = HttpContext.Current;
        if (httpContext == null)
        {
            throw new NullReferenceException("Can't access deep link session variable. HttpContext.Current is null.");
        }
        return (string)httpContext.Session[Constants.SessionDeepLinkUrl];
    }

public void SetDeepLink()
    {
        var httpContext = HttpContext.Current;
        if (httpContext == null)
        {
            throw new NullReferenceException("Can't access deep link session variable. HttpContext.Current is null.");
        }
        var queryString = httpContext.Request.Url.Query;
        if (!string.IsNullOrWhiteSpace(queryString))
        {
            var deepLink = HttpUtility.ParseQueryString(queryString)?.Get(Constants.DeepLinkQueryString);
            httpContext.Session[Constants.SessionDeepLinkUrl] = deepLink;
        }
    }

Заранее спасибо.

1 Ответ

1 голос
/ 21 апреля 2020

Chrome и другие браузеры недавно внесли изменения в то, как обрабатывается атрибут cookie файлов SameSite. Это потенциально влияет на все куки, включая ASP. NET сессионный повар ie, при участии в SAML SSO. Я подозреваю, что это проблема, которую вы видите.

Вам необходимо указать SameSite = None и Secure для ASP. NET сеанса cook ie. Это можно сделать, обновив ваше приложение web.config с помощью:

<sessionState cookieSameSite="None" />
<httpCookies requireSSL="true"/>

Для получения более подробной информации, пожалуйста, обратитесь к:

https://www.componentspace.com/Forums/10816/Application-Cookie-SameSite-None

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...