브라우저의 인증 대화 상자를 표시하지 않으려면 어떻게 해야 합니까?

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

문제

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

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

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

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

인증 대화 상자를 표시하지 않을 수 있는 방법이 있나요?특히, Firefox 2 이상에서 인증 필요 대화 상자를 표시하지 않을 수 있나요?Connect to를 억제하는 방법이 있습니까? [주인] IE 6 이상에서는 대화 상자가 있습니까?


편집하다
저자의 추가 정보(9월.18):
팝업되는 브라우저 인증 대화 상자의 실제 문제는 사용자에게 정보가 충분하지 않다는 점을 덧붙이고 싶습니다.

사용자는 로그인 페이지의 양식을 통해 방금 사용자 이름과 비밀번호를 입력했으며 두 가지를 모두 올바르게 입력했다고 믿고 제출 버튼을 클릭하거나 Enter 키를 눌렀습니다.그는 다음 페이지로 이동하거나 정보를 잘못 입력했으므로 다시 시도해야 한다는 말을 듣게 될 것이라고 기대합니다.그러나 그 대신 예상치 못한 대화 상자가 표시됩니다.

대화는 그가 방금 한 사실을 인정하지 않습니다. 했다 사용자 이름과 비밀번호를 입력하세요.문제가 있었다는 점과 다시 시도해야 한다는 점을 명확하게 밝히지 않습니다.대신 대화 상자에는 "사이트에 다음과 같은 내용이 나와 있습니다.'[왕국]'." 어디 [왕국] 프로그래머만이 좋아할 수 있는 짧은 영역 이름입니다.

웹 브라우저 디자이너는 다음 사항에 주목합니다.대화 상자 자체가 단순히 사용자에게 더 친숙하다면 인증 대화 상자를 억제하는 방법을 묻는 사람은 아무도 없을 것입니다.그만큼 전체 내가 로그인 양식을 작성하는 이유는 우리 제품 관리 팀이 브라우저의 인증 대화 상자를 끔찍하다고 생각하기 때문입니다.

도움이 되었습니까?

해결책

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

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

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

다른 팁

여기서도 같은 문제가 발생했는데 회사의 백엔드 엔지니어가 모범 사례로 간주되는 동작을 구현했습니다.클라이언트가 헤더를 설정한 경우 URL에 대한 호출이 401을 반환할 때 X-Requested-With: XMLHttpRequest, 서버는 www-authenticate 응답의 헤더.

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

API 호출에 X-Requested-With 헤더가 다음으로 설정됨 XMLHttpRequest.그렇다면 이 모범 사례에 따라 서버 동작을 변경하는 것 외에는 할 수 있는 일이 없습니다...

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

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

HTTP 응답을 제어할 수 있으면 WWW-Authenticate 헤더가 응답에 포함되며 브라우저는 로그인 대화 상자를 팝업하지 않습니다.

응답을 제어할 수 없는 경우 프록시를 설정하여 해당 응답을 필터링할 수 있습니다. WWW-Authenticate 응답의 헤더입니다.

내가 아는 한(틀렸다면 수정해 주시기 바랍니다.) 브라우저가 로그인 프롬프트를 수신하면 로그인 프롬프트를 방지할 수 있는 방법이 없습니다. WWW-Authenticate 머리글.

나는 이 질문과 그에 대한 답변이 매우 오래되었다는 것을 알고 있습니다.하지만 나는 여기서 끝났다.아마도 다른 사람들도 그럴 것입니다.

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

403에 대한 IETF 문서에서:

액세스 할 수없는 유효한 자격 증명을 수신하는 서버는 403 (금지) 상태 코드에 응답해야합니다.

Mozilla에서는 XMLHttpRequest 객체를 생성할 때 다음 스크립트를 사용하여 이를 달성할 수 있습니다.

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

두 번째 줄은 대화 상자를 방지합니다....

어떤 서버 기술을 사용하며, 인증에 사용하는 특정 제품이 있나요?

브라우저는 해당 작업만 수행하므로 401 상태 코드를 반환하지 않도록 서버 측에서 변경해야 한다고 생각합니다.이는 인증이 실패할 때 간단히 양식을 다시 반환하는 사용자 지정 인증 양식을 사용하여 수행할 수 있습니다.

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

jan.vdbergh에는 다른 상태 코드에 대해 서버 측에서 401을 변경할 수 있는 경우 브라우저가 팝업을 포착하여 표시하지 않는다는 사실이 있습니다.또 다른 해결 방법은 다른 사용자 정의 헤더에 대한 WWW-Authenticate 헤더를 변경하는 것입니다.왜 다른 브라우저가 이를 지원할 수 없는지 모르겠습니다. 일부 Firefox 버전에서는 mozBackgroundRequest를 사용하여 xhr 요청을 수행할 수 있지만 다른 브라우저에서는??여기 흥미로운 점이 있어요 링크 Chromium에서 이 문제가 발생했습니다.

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");

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

C#을 사용하지 않는 사람들을 위해 여기에 있습니다. ActionAttribute 그 반환 400 대신에 401, '제비' 기본 인증 대화상자입니다.

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
}

이것이 당신의 시간을 절약해주기를 바랍니다.

저는 Node, Express & Passport를 사용하고 있는데 같은 문제로 어려움을 겪고 있습니다.명시적으로 설정하여 작동하게 했습니다. www-authenticate 헤더를 빈 문자열로 바꿉니다.제 경우에는 다음과 같았습니다.

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

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

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