Я работаю с устаревшим кодом для исправления ошибки, связанной с перенаправлением входа в систему. Короче говоря, когда пользователь загружает страницу, которая имеет ссылку на страницу входа в систему, нажимает на ссылку входа в систему, которая переходит на нашу страницу входа в систему единого входа, а затем входит в систему на этой странице единого входа, они не перенаправляются на домашнюю страницу вместо на странице они были наконец. Исследуя это, способ, которым предыдущие разработчики решили это, заключался в том, чтобы сохранить «глубокую ссылку» как переменную в данных сеанса (у которых идентификатор сеанса сохранен в файле cook ie на клиенте и в памяти на сервере). Теоретически, при входе в систему пользователь должен получить эту глубокую ссылку из данных сеанса, а затем он должен быть перенаправлен. Однако именно здесь обнаруживается проблема: идентификатор сеанса во втором вызове (когда пользователь входит в систему) имеет другой идентификатор сеанса, и, таким образом, соответствующая глубокая ссылка не найдена среди данных сеанса этого идентификатора сеанса.
Я могу доказать, что идентификатор сеанса правильно хранится в cook ie в Chrome и SAML Tracer, а вызовы SAML происходят последовательно, и между ними не происходит никаких других вызовов. Я не вижу, чтобы идентификатор сеанса передавался в параметрах или заголовках http (хотя правильная ссылка, с которой пользователь должен go войти в систему, передается в качестве реферера в первом запросе SSO).
Я должен Также обратите внимание, что мы используем библиотеку SAML в ComponentSpace. Кроме того, при первом вызове go на странице единого входа появляется ошибка 302 Обнаружено, когда это перенаправлено. Я думаю, что это намеренно, но я не уверен на 100%. Единый вход - это ADFS.
Никто, кто работал над этим кодом, больше не работает в компании, и эта база кода, и эти библиотеки являются новыми для меня. Я также не уверен, является ли это проблемой с этим приложением или пользовательским веб-сайтом единого входа, к которому мы подключаемся, и мне нужно доказать это так или иначе. Ни один из нашего кода, касающегося этой проблемы, не изменялся в течение 2 или более лет в соответствии с TFS.
Мои вопросы:
- Почему идентификатор сеанса изменяется с первого вызова на второй ?
- Требуется ли дополнительная настройка для сохранения данных сеанса от вызова к вызову? Разве я не хочу разные идентификаторы сеанса для разных вызовов в целом?
- Как сохраняется сеанс для одного пользователя?
- Как мне доказать, является ли проблема изменением нашего приложения или того, к которому мы подключаемся?
Вот код первого вызова 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;
}
}
Заранее спасибо.