Файл cookie для проверки подлинности с помощью форм не отправляется в сообщении ajax с http на https (тот же домен) - PullRequest
0 голосов
/ 23 ноября 2011

Я отправляю форму AJAX со страницы в схеме http на URL https (домен и приложение совпадают).Я использую MVC 3 Ajax helper:

@using (Ajax.BeginForm(MVC.Payment.Confirm(), new AjaxOptions
{
    HttpMethod = "Post",
    UpdateTargetId = "myId",
    InsertionMode = InsertionMode.Replace,
    OnBegin = "$('#popupAjaxLoader').show();",
    OnSuccess = "$('#popupAjaxLoader').hide();",
    Url = "https://same.domain/payment/confirm"
}, new { @action = "https://same.domain.com/payment/confirm" }))
{   
...
}

В приложении я использую аутентификацию форм:

   <forms loginUrl="~/Account/LogOn" timeout="2880" name="MYCOOKIENAME" />

В firebug я вижу, что куки аутентификации не отправляются на сервер при отправкеформа, поэтому обработчик не работает (запрос должен быть авторизован).Как я могу заставить Ajax.BegiForm прикреплять cookie аутентификации?

ОБНОВЛЕНИЕ:

Оказалось, что решение, предложенное counsellorben, работает, если нет необходимости получать какие-либоинформация обратно из запроса AJAX.Отправка Ajax POST из HTTP в HTTPS работает нормально (файлы cookie не прикреплены, поэтому вы должны POST все необходимые данные в виде скрытых полей формы), но ответ сервера недоступен для javascript из-за той же политики происхождения.В конце концов мне пришлось отказаться от Ajax и поместить форму в iframe со ссылкой на HTTPS url, который, кажется, является окончательным решением этой проблемы.

1 Ответ

2 голосов
/ 23 ноября 2011

Ваша проблема в том, что это нарушает Same Origin Policy. См. Ответ на этот вопрос: Та же политика происхождения с тем же доменом, но https .

UPDATE

Если невозможно заставить весь портал использовать HTTPS, то альтернативой является использование другой схемы аутентификации для отправки формы AJAX.

Я бы предложил создать токен GUID для формы AJAX, сохранив GUID в вашем хранилище вместе с (1) временем его создания и (2) идентификатором пользователя, которому был назначен GUID. Затем передайте GUID в скрытом поле в вашей форме AJAX.

Удалите атрибут [Authorize] из действия, вызываемого через форму AJAX, и вместо этого проверьте в своем действии, что GUID передан, GUID действителен и не истек (установив время истечения 20 минут, или что-то еще действительное в этих обстоятельствах). Используйте маркер GUID для идентификации вашего пользователя и действуйте по мере необходимости.

Кроме того, у вас должен быть какой-то метод для очистки маркеров GUID с истекшим сроком действия.

Это должно обеспечить достаточную безопасность, поскольку токен GUID выдается авторизованному пользователю и идентифицирует пользователя, отправляющего форму AJAX. Он также позволяет использовать HTTPS только для отправки формы AJAX, поскольку вы больше не полагаетесь на передаваемый файл cookie аутентификации.

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