同一域 AJAX 呼叫被第 3 方身份验证重定向
Same domain AJAX calls being redirected by 3rd party authentication
在我们的 asp.net 核心应用程序中,我需要对 IIS 8.0 服务器进行 AJAX 调用。
服务器 URL 受 CA SiteMinder SSO 保护。
当我使用 AJAX 发出 Get 请求时,我得到了想要的响应。但相反,每当发出 Put 或 Post 请求时,我都会收到 302 响应和 url,这表明 SiteMinder 正在请求凭据。
我的观点是,只要用户通过 SiteMinder 的身份验证,那么从同一浏览器向同一域发出的请求就不会明确要求用户凭据。
据我所知,SiteMinder 正在请求用户凭据,即使用户已经过身份验证并且请求 (PUT & POST) 是针对同一域的。
CA SiteMinder 提供了一个 cookie (HttpOnly),我认为它用于验证向服务器发出的请求。我可以确认请求中包含 SiteMinder cookie headers。
我的问题是为什么 SiteMinder 以不同的方式处理 GET 和 POST/Put 请求?或者有什么方法可以使我的 POST/PUT 请求通过使用 XHR 的 Siteminder 工作(无需从 SiteMinder 获得重定向)?
这是发出 XHR 请求的 link 函数。
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();
}
如果 SiteMinder cookie 是 HttpOnly,那么 ajax 引擎将不会明确发送它。这就是 HttpOnly 的意思。
另外,SiteMinder(现在称为 CA SSO)明确区分不同的 HTTP 方法,因此 SiteMinder 规则对于 GET POST 和 PUT 可以不同。您的 SiteMinder 管理员将需要检查适用于您的应用程序的规则,以确保它们专门涵盖 GET POST 和 PUT(通常不包括 PUT)。
HTH!
在我们的 asp.net 核心应用程序中,我需要对 IIS 8.0 服务器进行 AJAX 调用。 服务器 URL 受 CA SiteMinder SSO 保护。
当我使用 AJAX 发出 Get 请求时,我得到了想要的响应。但相反,每当发出 Put 或 Post 请求时,我都会收到 302 响应和 url,这表明 SiteMinder 正在请求凭据。
我的观点是,只要用户通过 SiteMinder 的身份验证,那么从同一浏览器向同一域发出的请求就不会明确要求用户凭据。
据我所知,SiteMinder 正在请求用户凭据,即使用户已经过身份验证并且请求 (PUT & POST) 是针对同一域的。 CA SiteMinder 提供了一个 cookie (HttpOnly),我认为它用于验证向服务器发出的请求。我可以确认请求中包含 SiteMinder cookie headers。
我的问题是为什么 SiteMinder 以不同的方式处理 GET 和 POST/Put 请求?或者有什么方法可以使我的 POST/PUT 请求通过使用 XHR 的 Siteminder 工作(无需从 SiteMinder 获得重定向)?
这是发出 XHR 请求的 link 函数。
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();
}
如果 SiteMinder cookie 是 HttpOnly,那么 ajax 引擎将不会明确发送它。这就是 HttpOnly 的意思。
另外,SiteMinder(现在称为 CA SSO)明确区分不同的 HTTP 方法,因此 SiteMinder 规则对于 GET POST 和 PUT 可以不同。您的 SiteMinder 管理员将需要检查适用于您的应用程序的规则,以确保它们专门涵盖 GET POST 和 PUT(通常不包括 PUT)。
HTH!