Сессии без файлов cookie и посты между сайтами - PullRequest
5 голосов
/ 04 января 2010

Вот ситуация ...

Сайт 1) ASP.NET MVC-приложение для клиентов для входа в систему, просмотра и оплаты счетов и т. Д. Этот сайт использует ASP-сеансы без cookie-файлов, что позволяет запускать несколько сеансов в браузерах с вкладками.

Сайт 2) Корпоративный сайт со стандартным статическим контентом. Это будет иметь небольшую форму в верхней части каждой страницы с формой имени пользователя / пароля, которая будет публиковаться в приложении MVC.

При публикации в приложении MVC создается новый сеанс, и сайт возвращает перенаправление 302 с идентификатором сеанса в URL (как и ожидалось). Контроллер имеет два метода входа в систему, один для обработки GET, другой для обработки POST. Из-за перенаправления он выполняет метод GET и теряет значения формы.

Изменяя метод на корпоративном сайте, чтобы сделать форму GET, а не POST, имя пользователя и пароль сохраняются в строке запроса после перенаправления, и я мог бы обрабатывать запросы таким образом, но я бы предпочел сделать POST и не передавать эти данные в URL.

Моя интуиция говорит, что реализация какого-то пользовательского HttpHandler позволила бы мне это сделать, но я не уверен, где я смогу увязать в создании сеанса. Точка останова в Session_Start в global.asax показывает, что идентификатор сеанса уже был создан и перенаправление уже произошло в этот момент.

Ответы [ 3 ]

2 голосов
/ 05 января 2010

Мне кажется, я нашел место, где происходило перенаправление, а также возможное решение. Интерфейс ISessionIDManager имеет метод SaveSessionID с параметром «out bool redirected». Похоже, что при создании нового сеанса менеджер сеансов по умолчанию переписывает URL-адрес внутри этого метода и выполняет перенаправление. Я поэкспериментировал с реализацией собственного ISessionIDManager и смог подавить перенаправление, но я не могу (как я могу сказать) вставить идентификатор сеанса в URL для сеанса без cookie без перенаправления. Server.Transfer не допускается на этом этапе жизненного цикла запроса. Я пытался это сделать, но получил сообщение «Ошибка выполнения дочернего запроса».

Позже я нашел эту статью на Включение POST в приложениях ASP.NET без файлов cookie . В основном, связавшись с событием Application_EndRequest, вы можете обнаружить перенаправление, очистить ответ и подделать сообщение формы по новому URL-адресу, содержащему идентификатор сеанса.

void MvcApplication_EndRequest(object sender, EventArgs e)
{

    HttpApplication application = (HttpApplication)sender;

    if (application.Request.Form["CorpLogin"] == "1"
        && application.Response.RedirectLocation != null
        && application.Response.IsRequestBeingRedirected)
    {

        StringBuilder build = new StringBuilder();
        build.Append("<html>\n<body>\n<form name='Redirect' method='post' action='");
        build.Append(application.Response.RedirectLocation);

        build.Append("' id='Redirect' >");
        foreach (string key in application.Request.Form)
        {
            if (key != "CorpLogin")
                build.Append(string.Format("\n<input type='hidden' name='{0}' value = '{1}'>", (string)key, application.Request.Form[(string)key]));
        }

        build.Append("\n<noscript><h2>Object moved <input type='submit' value='here'></h2></noscript>");
        build.Append(@"</form>
      <script language='javascript'>
      <!--
        document.Redirect.submit();
      // -->
      </script>
      ");
        build.Append("</body></html>");

        application.Response.Clear();
        application.Response.ClearHeaders();
        application.Response.Output.Flush();

        application.Response.Write(build.ToString());

    }
}

ИМХО, это не идеальное решение, но оно может быть достаточно работоспособным, чтобы соответствовать требованиям.

0 голосов
/ 04 января 2010

Вы ищете Server.Transfer эквивалент в MVC (см. Ответ Саймона.)

Это похоже на Request.Redirect, но просто переносит обработку .NET на другую страницу. Это также позволяет поддерживать переменные формы даже на POST между передачами (в данном случае это RouteValueDictionary).

РЕДАКТИРОВАТЬ: (ответ на ваш комментарий № 1)

Вот пример Аутентификация с помощью MVC . Не зная внутренностей вашего механизма авторизации, я не совсем уверен. В любой момент процесса «DoLogin» вы сможете выполнять перевод вместо перенаправления.

0 голосов
/ 04 января 2010

Когда сайт MVC создает редирект, вы сами обрабатываете его с помощью контроллера или он автоматически маршрутизируется вашим провайдером членства?

Если вы можете перехватить запрос до перенаправления, вы можете поместить имя пользователя и пароль в переменную TempData и обработать его после перенаправления.

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