브라우저의 인증 대화 상자를 숨기려면 어떻게해야합니까?


85

내 웹 애플리케이션에는 AJAX 호출을 통해 인증 자격 증명을 제출하는 로그인 페이지가 있습니다. 사용자가 올바른 사용자 이름과 비밀번호를 입력하면 모든 것이 정상이지만 그렇지 않은 경우 다음이 발생합니다.

  1. 웹 서버는 요청에 올바른 형식의 Authorization 헤더가 포함되어 있지만 헤더의 자격 증명이 성공적으로 인증되지 않았 음을 확인합니다.
  2. 웹 서버는 401 상태 코드를 반환하고 지원되는 인증 유형을 나열하는 하나 이상의 WWW-Authenticate 헤더를 포함합니다.
  3. 브라우저는 XMLHttpRequest 개체에 대한 내 호출에 대한 응답이 401이고 응답에 WWW-Authenticate 헤더가 포함되어 있음을 감지합니다. 그런 다음 사용자 이름과 암호를 다시 묻는 인증 대화 상자가 나타납니다.

3 단계까지는 괜찮습니다. 대화창이 뜨는 것을 원하지 않습니다. AJAX 콜백 함수에서 401 응답을 처리하고 싶습니다. (예를 들어, 로그인 페이지에 오류 메시지를 표시합니다.) 물론 사용자가 사용자 이름과 비밀번호를 다시 입력하기를 원하지만 브라우저의 추악한 기본값이 아닌 친근하고 안심할 수있는 로그인 양식을 볼 수 있기를 바랍니다. 인증 대화 상자.

덧붙여서, 저는 서버를 제어 할 수 없으므로 사용자 지정 상태 코드 (예 : 401 이외의 코드)를 반환하도록하는 것은 옵션이 아닙니다.

인증 대화 상자를 숨길 수있는 방법이 있습니까? 특히 Firefox 2 이상에서 인증 필요 대화 상자를 표시하지 않을 수 있습니까? IE 6 이상에서 [호스트]에 연결 대화 상자 를 표시하지 않는 방법이 있습니까?



저자의 추가 정보 편집 (9 월 18 일) :
브라우저 인증 대화창이 뜨는 진짜 문제는 사용자에게 정보가 충분하지 않다는 점이라고 덧붙여 야합니다.

사용자는 로그인 페이지의 양식을 통해 사용자 이름과 비밀번호를 입력했으며, 둘 다 올바르게 입력했다고 믿고 제출 버튼을 클릭하거나 Enter 키를 누릅니다. 그의 기대는 그가 다음 페이지로 이동하거나 자신의 정보를 잘못 입력 했으므로 다시 시도해야한다는 것입니다. 그러나 대신 예기치 않은 대화 상자가 나타납니다.

대화는 그가 단지 사실을 전혀 인정하지 않으며 사용자 이름과 암호를 입력합니다. 문제가 있었으며 다시 시도해야한다는 내용이 명확하지 않습니다. 대신 대화 상자는 "사이트에 ' [realm] '이라고 표시됩니다." 와 같은 비밀 정보를 사용자에게 표시합니다 . 여기서 [realm] 은 프로그래머 만이 좋아할 수있는 짧은 영역 이름입니다.

웹 브라우저 설계자들은주의를 기울입니다. 대화 자체가 단순히 사용자 친화적 인 경우 인증 대화 상자를 숨기는 방법을 묻는 사람은 아무도 없습니다. 전체 I는 로그인 양식을하고있는 중이 야한다는 이유는 우리의 제품 관리 팀은 바르게 브라우저 '인증 대화 상자가 끔찍한 것으로 간주한다는 것입니다.


1
대답은 좋은 대답이 없다는 것입니다. Marijn이 제안한 해킹은 최대한 가깝습니다. 물론 가능하다면 브라우저가 아닌 서버와 자바 스크립트에서 이해하는 사용자 지정 인증을 사용하는 것도 트릭을 수행합니다.
dgvid

나는 같은 문제에 있었고 여기에 내 블로그가 아닌 stackoverflow의 주석에서이 링크를 찾았습니다. loudvchar.blogspot.ca/2010/11/… 도움이 되기를 바랍니다.
gies0r 2013 년

답변:


17

이것이 가능하지 않다고 생각합니다. 브라우저의 HTTP 클라이언트 구현을 사용하면 항상 해당 대화 상자가 나타납니다. 두 가지 핵이 떠 오릅니다.

  1. Flash가 이것을 다르게 처리 할 수 ​​있으므로 (아직 시도하지 않았 음) Flash 동영상을 요청하면 도움이 될 수 있습니다.

  2. 자신의 서버에서 액세스하는 서비스에 대한 '프록시'를 설정하고 브라우저가 인식하지 못하도록 인증 헤더를 약간 수정하도록 할 수 있습니다.


"불가능"이 정답 인 것처럼 보이지만 "프록시"해킹이 트릭을 할 것이라고 생각합니다.
dgvid

@Stobor 귀하가 게시 한 중복에 대한 수락 된 답변은 실제로이 질문에 대한 답변으로 다시 연결됩니다!
8bitjunkie 2014

3
@ 7SpecialGems 좋은 캐치. 나는 그것이 속임수라고 제안하지 않았으며, 수락 된 답변 4 년 후에 게시 된 특정 답변 (WWW-Authenticate 하나)에 연결했습니다. 돌이켜 보면 내가 왜 그것을 보았는지, 어떻게 그것을 테스트했는지 기억할 수 없습니다.
Stobor

1
이 코드로 무단 401 오류를 잡으려고합니다. $ .ajaxSetup ({statusCode : {401 : function () {RedirectToLogin ();}}}); 그러나 IE는 항상 브라우저의 인증 대화 상자를 표시합니다. ASP.Net MVC 2에서이 대화 상자를 어떻게 억제 할 수 있습니까?
PaulP

@PaulP는 말했듯이 WWW-Authenticate 헤더의 401 상태 코드 응답을 제거하는 프록시 또는 일종의 사용자 지정 서버 구현이 필요합니다.
Motes

51

여기에서 동일한 문제가 발생했고 회사의 백엔드 엔지니어는 분명히 좋은 방법으로 간주되는 동작을 구현했습니다. URL 호출이 401을 반환 할 때 클라이언트가 헤더를 설정 한 X-Requested-With: XMLHttpRequest경우 서버 www-authenticate는 해당 헤더를 삭제합니다. 응답.

부작용은 기본 인증 팝업이 나타나지 않는다는 것입니다.

API 호출에 X-Requested-With헤더가로 설정되어 있는지 확인하십시오 XMLHttpRequest. 그렇다면이 모범 사례에 따라 서버 동작을 변경하는 것 외에는 할 일이 없습니다.


3
백엔드가 Java / Spring 기반 인 경우 DelegatingAuthenticationEntryPoint에서이 동작을 처리합니다.
Derek Slife

감사합니다. Devise를 포함한 많은 도서관에서이 동작을 채택했습니다
josephnvu

1
nginx에서 이것을 수행하는 방법을 알고 있습니까? "URL 호출이 401을 반환 할 때 클라이언트가 X-Requested-With : XMLHttpRequest 헤더를 설정 한 경우 서버는 응답에서 www-authenticate 헤더를 삭제합니다."
markmnl

18

브라우저는 다음 조건이 모두 충족되면 로그인 프롬프트를 표시합니다.

  1. HTTP 상태는 4xx입니다.
  2. WWW-Authenticate 응답에 헤더가 있습니다.

HTTP 응답을 제어 할 수있는 경우 응답에서 WWW-Authenticate헤더를 제거 할 수 있으며 브라우저는 로그인 대화 상자를 표시하지 않습니다.

응답을 제어 할 수없는 경우 응답에서 WWW-Authenticate헤더 를 필터링하도록 프록시를 설정할 수 있습니다 .

내가 아는 한 (내가 틀렸다면 자유롭게 수정하십시오) 브라우저가 WWW-Authenticate헤더를 받으면 로그인 프롬프트를 막을 방법이 없습니다 .


좋은 정보입니다. 유효한 WWW-Authenticate헤더 값에 대해서는 stackoverflow.com/a/1748451/225217
Brice Roncace를

6

나는이 질문과 그 대답이 매우 오래되었다는 것을 알고 있습니다. 하지만 여기까지 왔어요. 아마도 다른 사람들도 마찬가지 일 것입니다.

401을 반환하는 웹 서비스에 대한 코드에 액세스 할 수있는 경우이 상황에서 401 대신 403 (금지)을 반환하도록 서비스를 변경하면됩니다. 브라우저는 403에 대한 응답으로 자격 증명을 요구하지 않습니다. 403은 특정 리소스에 대한 권한이없는 인증 된 사용자에 대한 올바른 코드. OP의 상황 인 것 같습니다.

403의 IETF 문서에서 :

액세스 권한을 얻기에 적합하지 않은 유효한 자격 증명을받는 서버는 403 (금지됨) 상태 코드로 응답해야합니다.


4

Mozilla에서는 XMLHttpRequest 객체를 만들 때 다음 스크립트를 사용하여 수행 할 수 있습니다.

xmlHttp=new XMLHttpRequest();
xmlHttp.mozBackgroundRequest = true;
xmlHttp.open("GET",URL,true,USERNAME,PASSWORD);
xmlHttp.send(null);

두 번째 줄은 대화 상자를 막습니다 ....


1
Firefox 2에서는 아무 작업도 수행하지 않는 것 같습니다. Firefox 3에서 DOM 보안 오류 NS_ERROR_DOM_SECURITY_ERR 코드 1000이 발생합니다.
dgvid

2

어떤 서버 기술을 사용하고 있으며 인증에 사용하는 특정 제품이 있습니까?

브라우저가 그 일을하고 있기 때문에 401 상태 코드를 반환하지 않으려면 서버 측에서 변경해야한다고 생각합니다. 이는 인증이 실패 할 때 양식을 다시 반환하는 사용자 지정 인증 양식을 사용하여 수행 할 수 있습니다.


2

Mozilla 영역에서 XMLHttpRequest ( docs ) 의 mozBackgroundRequest 매개 변수 를 true로 설정하면 이러한 대화 상자가 표시되지 않고 요청이 실패하게됩니다. 그러나 브라우저 간 지원이 얼마나 좋은지 모르겠습니다 (실패한 요청에 대한 오류 정보의 품질이 브라우저간에 매우 좋은지 포함).


moz- 접두사는 브라우저 간 지원이 없음을 의미합니다 (다른 각 브라우저에서 작동하는 유사한 매개 변수를 찾을 수없는 경우).
Brilliand

2

jan.vdbergh는 진실을 가지고 있습니다. 다른 상태 코드에 대해 서버 측에서 401을 변경할 수 있다면 브라우저가 팝업을 포착하고 페인트하지 않습니다. 또 다른 솔루션은 다른 사용자 지정 헤더의 WWW-Authenticate 헤더를 변경하는 것입니다. 다른 브라우저가 지원할 수없는 이유를 모르겠습니다. Firefox의 일부 버전에서는 mozBackgroundRequest로 xhr 요청을 수행 할 수 있지만 다른 브라우저에서는 ?? 여기 Chromium에서이 문제와 관련된 흥미로운 링크 가 있습니다.


1

MVC 5 및 VPN에서도 VPN을 사용하여 DMZ 외부에있을 때마다이 브라우저 메시지에 응답해야하는 동일한 문제가 있습니다. .net을 사용하여 간단히 다음을 사용하여 오류 라우팅을 처리합니다.

<customErrors defaultRedirect="~/Error"  >
  <error statusCode="401" redirect="~/Index"/>
</customErrors>

지금까지는 홈 컨트롤러 아래의 Index 작업이 사용자의 유효성을 검사하기 때문에 작동했습니다. 로그온에 실패한 경우이 작업의보기에는 디렉터리 서비스에 전달 된 LDAP 쿼리를 사용하여 사용자를 로그인하는 데 사용하는 로그인 컨트롤이 있습니다.

      DirectoryEntry entry = new DirectoryEntry("LDAP://OurDomain");
      DirectorySearcher Dsearch = new DirectorySearcher(entry);
      Dsearch.Filter = "(SAMAccountName=" + UserID + ")";
      Dsearch.PropertiesToLoad.Add("cn");

이것은 지금까지 잘 작동했지만 여전히 테스트 중이며 위의 코드는 실행할 이유가 없으므로 제거 될 수 있음을 알려야합니다. 현재 테스트에는 두 번째 세트가있는 경우를 발견하려는 시도가 포함됩니다. 코드의 더 이상 사용됩니다. 다시 말하지만, 이것은 진행중인 작업이지만, 도움이 될 수 있거나 몇 가지 아이디어를 얻기 위해 두뇌를 움직일 수 있으므로 지금 추가하기로 결정했습니다. 모든 테스트가 완료되면 최종 결과로 업데이트하겠습니다.


1

Node, Express 및 Passport를 사용하고 있으며 동일한 문제로 어려움을 겪고 있습니다. www-authenticate헤더를 명시 적으로 빈 문자열로 설정하여 작동하도록했습니다 . 제 경우에는 다음과 같이 보였습니다.

(err, req, res, next) => {
  if (err) {
    res._headers['www-authenticate'] = ''
    return res.json(err)
  }
}

누군가에게 도움이되기를 바랍니다!


0

unsing C # 의 경우 , 대신 ActionAttribute반환되는 기본 인증 대화 상자가 있습니다.400401

public class NoBasicAuthDialogAuthorizeAttribute : AuthorizeAttribute
{
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        base.HandleUnauthorizedRequest(filterContext);
        filterContext.Result = new HttpStatusCodeResult(400);
    }
}

다음과 같이 사용하십시오.

[NoBasicAuthDialogAuthorize(Roles = "A-Team")]
public ActionResult CarType()
{
 // your code goes here
}

이것이 시간을 절약하기를 바랍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.