Вызовы AJAX одного домена перенаправляются сторонней аутентификацией
В нашем основном приложении asp.net мне нужно сделать AJAX-вызов на сервер IIS 8.0. URL-адрес сервера защищен CA SiteMinder SSO.
Когда я делаю запросы Get, используя AJAX, я получаю желаемый ответ. Но, наоборот, всякий раз, когда делается запрос на размещение или публикацию, я получаю ответ 302 и URL, который предполагает, что SiteMinder запрашивает учетные данные.
Я придерживался мнения, что до тех пор, пока SiteMinder аутентифицирует пользователя, запросы, сделанные в один и тот же домен из одного сеанса браузера, не требуют явных учетных данных пользователей.
Насколько я вижу, SiteMinder запрашивает учетные данные пользователя, даже если пользователь прошел аутентификацию и запросы (PUT & POST) отправляются в один и тот же домен. CA SiteMinder предоставляет файл cookie (HttpOnly), который, я считаю, используется для проверки подлинности запросов, отправляемых на сервер. Я могу подтвердить, что файл cookie SiteMinder включен в заголовки запросов.
У меня вопрос, почему SiteMinder по-разному обрабатывает запросы GET и POST/Put? Или есть ли способ заставить мой запрос POST/PUT работать (без перенаправления из SiteMinder) с Siteminder с использованием XHR?
Вот ссылка на функцию, которая делает запрос XHR.
function fixRecords() {
_buildingId = ($("input:hidden[id='buildingIdModal']").val());
_roomNo = $("#roomNoModal").val();
if ((_roomNo === "" || _roomNo == null) && _suggestedRoomNo) {
_roomNo = document.getElementById("roomNoModal").value;
}
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function () {
if (this.readyState == 4 && this.status.toString() == 200) {
var message = "Record updated sucessfully.";
var jsonResponse = JSON.parse(this.responseText);
console.log(jsonResponse);
_roomNo = jsonResponse.roomNo;
_buildingId = jsonResponse.building;
_runId = jsonResponse.runId;
var _prevRoomId = _roomId;
_roomId = jsonResponse.roomId;
_recId = jsonResponse.recordId;
message = jsonResponse.comment;
_valid = jsonResponse.valid;
_suggestion = '<div class="glyphicon glyphicon-alert text-info">' + jsonResponse.suggestion+'</div>';
_suggestedRoomId = jsonResponse.suggestedRoomId;
_suggestedRoomNo = jsonResponse.suggestedRoomNo;
var _protocol = jsonResponse.protocol;
var _invAcct = jsonResponse.account;
var _pi = jsonResponse.pi;
displayInformationInFixModal(message + _suggestion, null);
$('#fixModal').on('show.bs.modal', inflateModal(message, _buildingId, _cageId, _roomId, _roomNo, _recId, _runId, _frequencyId, _frequencyType, _valid, _suggestedRoomId, _suggestedRoom, _suggestion, _protocol, _pi, _invAcct));
$('#fixModal').modal('show').on("hide", function () {
$('#fixModal').modal('hide');
});
//document.write(this.responseText);
}
$('#showLoadingImage').modal('hide');
return false;
};
if (_roomNo == null || _roomNo.trim()===''|| _roomNo==="Room Num Unknown") {
alert("Please enter a valid Room No.");
var message = "Please enter a valid Room No.";
$('#fixModal').on('show.bs.modal', populateModalMessage(message));
$('#fixModal').modal('show').on("hide", function () {
$('#fixModal').modal('hide');
});
}
if (_recId <=0) {
xhttp.open("POST", "/FileUploads/InsertFixRecordToDB?BuildingId=" + _buildingId );
}
else {
xhttp.open("PUT", "/FileUploads/FixARecord?BuildingId=" + _buildingId );
}
$('#showLoadingImage').modal('show');
$('#showLoadingImage').css('zIndex', 1500);
xhttp.send();
}
1 ответ
Если файл cookie SiteMinder имеет значение HttpOnly, он явно не будет отправлен движком ajax. Вот что значит HttpOnly.
Отдельно, SiteMinder (теперь называется CA SSO) определенно различает разные методы HTTP, поэтому правила SiteMinder могут быть разными для GET POST и PUT. Ваш администратор SiteMinder должен будет проверить правила, применимые к вашему приложению, чтобы убедиться, что они специально охватывают GET POST и PUT (PUT особенно часто не включается).
НТН!