同一域 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!