xmlhttprequest를 사용할 때 401 응답에서 브라우저의 로그인 프롬프트를 억제하는 방법이 있습니까?

StackOverflow https://stackoverflow.com/questions/361467

문제

jquert .ajax 함수를 사용하여 페이지 메소드를 호출하고 있습니다. 이 사이트는 Formsauthentication을 사용하고 있습니다. 따라서 인증 티켓이 페이지 메소드로 호출을 만료하면 로그인 페이지로 리디렉션이 발생합니다.

이제 System.web.handlers.scriptModule을 작성한 천재는 어떤 이유로 든 페이지 스타일 호출이 페이지 메소드 또는 웹 서비스 메소드로 호출되면 JavaScript에서 302 리디렉션을 유발한다고 결정했습니다. 401 무단으로 응답. 이로 인해 브라우저가 사용자가 사용자 이름과 암호를 입력하려고 시도하기 때문에 완전히 오도하는 로그인 UI를 팝업하게합니다. 이는 Formsauthentication이 사용되기 때문에 아무 의미가 없습니다. 마지막으로 사용자가 취소를 클릭하면 401이 오류 처리기로 나옵니다.

따라서 문제는 어떤 식 으로든 브라우저의 로그인 UI 프롬프트를 어떻게 비활성화 할 수 있습니까? 웹의 일부 사람들은 XHR 요청에서 사용자 이름과 비밀번호를 사용하는 것을 제안하지만 작동하지 않는 것 같습니다.

도움이 되었습니까?

해결책

나는 그 주변에서 일했다고 생각합니다. 물론 내부 MS Ajax 관련 오류에 의존하는 것은 정말 좋지는 않지만이 문제에 대해 다른 사람들에게 트릭을 수행 할 것입니다.

기본적으로 당신이하는 일은 당신이 설정하는 것입니다 x-microsoftajax 값에 대한 헤더 델타 = 참 (사례는 여기에서 중요합니다), ScriptModule은 이것을 일반 리디렉션으로 해석하고 응답을 200,하지만 설정합니다 PagerEdirect 소비 할 페이지의 모든 ScriptManager (MS-Ajax PagerequestManager)의 데이터 문자열. jQuery.ajax 함수는 여전히 이것을 오류로 간주하므로 기본적으로 확인할 수 있습니다. PagerEdirect XHR의 ResponseText 속성에서 그에 따라 Hadle. 사용자를 로그인 페이지로 보내는 것과 같습니다.

    $.ajax({
            type: "POST",
            url: postUrl + "/SomePageMethod",
            data: "{searchString:\"" + escape(searchString) + "\"}",
            contentType: "application/json; charset=utf-8",
            beforeSend: function(xhr) {
                xhr.setRequestHeader("X-MicrosoftAjax","Delta=true");
            },
            dataType: "json",
            success: onSuccess,
            error: onError
        });

function onError(xhr, e, textStatus) {
    var isAjaxRedirect = xhr.status == 200 && xhr.responseText.match(/pageRedirect/);
    if (isAjaxRedirect == "pageRedirect") {
        // forms authentication ticket expired
        location.href = "a session timeout page, or a login page or whatever";
    }
}

다른 팁

이것은 IIS에서 비활성화 될 수 있습니다. 아래에 설명 된 세부 사항은 IIS6 용이지만 IIS7 이상 관련 항목을 찾기가 어렵지 않아야합니다.

  1. 관련 사이트를 찾으십시오.
  2. IIS 버전에서 "디렉토리 보안"탭 또는 관련 탭을 엽니 다.
  3. "인증 및 액세스 제어"섹션에서 "편집"을 클릭하십시오.
  4. "통합 된 Windows 인증"을 취소하지 않습니다.

더 이상 브라우저에서 팝업을보고 원하는대로 올바른 상태 코드를 다시 보낼 수 있어야합니다.

둘 다 훌륭한 대답입니다. 그러나 웹 사이트가 공유 서버에서 호스팅되면 IIS 설정을 변경할 수 없으므로 클라이언트 측 솔루션이 흔들릴 수 있습니다. 나는 같은 문제에 직면 해 왔으며이 게시물은 나를 구해줍니다. 솔루션에 대한 두 센트 : jQuery (적어도 최신 버전의 경우)에서 "헤더"라는 매개 변수를 사용하여 "BeforeSend"콜백을 사용하지 않고이 헤더를 보낼 수 있으며, 이것이 조금 더 깨끗한 방법이라고 생각합니다. 똑같다. 여기에서 다른 헤더 정보를 추가 할 수도 있습니다.

$.ajax({
            type: "POST",
            url: postUrl + "/SomePageMethod",
            data: "{searchString:\"" + escape(searchString) + "\"}",
            contentType: "application/json; charset=utf-8",
        headers: { "cache-control": "no-cache", "X-MicrosoftAjax" : "Delta=true" },
            dataType: "json",
            success: onSuccess,
            error: onError
        });

이 헤더“Delta = True”에 대해 몰랐고 약간의 연구 후, 서버에 귀하가 수행하는 요청이 비동기식 포스트 백 요청이라고 말하는 것이 헤더 인 것 같습니다.

AJAX 호출은 "오류"콜백에서 "무단"401 대신 HTTP 상태 200을 반환합니다. 즉, 서버 요청이 어떤 식 으로든 성공했음을 의미합니다 (인증이 실패하더라도). 조금 이상하지만 작동 방식입니다.

도움이 되었기를 바랍니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top