首页 > 解决方案 > 第 3 方身份验证重定向相同域的 AJAX 调用

问题描述

在我们的 asp.net 核心应用程序中,我需要对 IIS 8.0 服务器进行 AJAX 调用。服务器 URL 受 CA SiteMinder SSO 保护。

当我使用 AJAX 发出 Get 请求时,我得到了所需的响应。但相反,每当发出 Put 或 Post 请求时,我都会收到 302 响应和表明 SiteMinder 正在请求凭据的 url。

我的观点是,只要用户通过 SiteMinder 的身份验证,那么从同一个浏览器会话向同一个域发出的请求就不会明确要求用户凭据。

据我所知,SiteMinder 正在请求用户凭据,即使用户已经过身份验证并且请求(PUT 和 POST)是针对同一个域的。CA SiteMinder 提供了一个 cookie (HttpOnly),我相信它用于验证向服务器发出的请求。我可以确认 SiteMinder cookie 包含在请求标头中。

我的问题是为什么 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();
    }

标签: javascriptajaxasp.net-corexmlhttprequestsiteminder

解决方案


如果 SiteMinder cookie 是 HttpOnly,那么 ajax 引擎将不会显式发送它。这就是 HttpOnly 的意思。

另外,SiteMinder(现在称为 CA SSO)明确区分不同的 HTTP 方法,因此对于 GET POST 和 PUT,SiteMinder 规则可能不同。您的 SiteMinder 管理员需要检查适用于您的应用程序的规则,以确保它们专门涵盖 GET POST 和 PUT(尤其是 PUT 通常不包括在内)。


推荐阅读