programing

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

javamemo 2023. 3. 16. 21:04
반응형

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

웹 어플리케이션에는 AJAX 콜을 통해 인증 credential을 전송하는 로그인 페이지가 있습니다.사용자가 올바른 사용자 이름과 비밀번호를 입력하면 모든 것이 정상이지만 그렇지 않을 경우 다음과 같이 됩니다.

  1. 웹 서버는 요청에 적절한 형식의 Authorization 헤더가 포함되었지만 헤더 내의 credential이 정상적으로 인증되지 않았다고 판단합니다.
  2. 웹 서버는 401 상태 코드를 반환하고 지원되는 인증 유형을 나열하는1개 이상의 WWW-Authenticate 헤더를 포함합니다.
  3. 브라우저는 XMLHttpRequest 객체의 콜에 대한 응답이 401임을 검출하고 응답에 WWW-Authenticate 헤더가 포함되어 있습니다.그런 다음 사용자 이름과 비밀번호를 다시 입력하라는 인증 대화상자가 나타납니다.

3단계까지는 괜찮습니다.대화상자가 뜨지 않도록 AJAX 콜백 함수로 401 응답을 처리하고 싶다.(예를 들어 로그인 페이지에 오류 메시지가 표시됨)물론 사용자가 사용자 이름과 비밀번호를 다시 입력하기를 원하지만 브라우저의 보기 흉한 기본 인증 대화상자가 아닌 나의 알기 쉽고 안심할 수 있는 로그인 폼을 보여주길 원합니다.

덧붙여서 서버를 제어할 수 없기 때문에 커스텀 상태 코드(401 이외)를 반환하는 것은 선택사항이 아닙니다.

인증 대화상자를 억제할 수 있는 방법이 있습니까?특히 Firefox 2 이후에서는 [Authentication Required]대화상자를 억제할 수 있습니까?IE 6 이후에 [호스트에 연결]대화상자를 표시하지 않도록 하는 방법이 있습니까?


★★★★★
로부터의 추가 18일
브라우저 인증 대화상자가 뜨는 진짜 문제는 사용자에게 충분한 정보를 주지 못한다는 것입니다.

사용자는 로그인 페이지의 폼에서 사용자 이름과 패스워드를 입력했을 뿐이며, 양쪽을 올바르게 입력했다고 판단하고 송신 버튼을 클릭하거나 Enter 키를 누릅니다.다음 페이지로 이동하거나 정보를 잘못 입력했으므로 다시 시도해야 한다는 것이 그의 예상입니다.하지만 그는 예상치 못한 대화 상자를 받게 된다.

대화상자는 그가 방금 사용자 이름과 비밀번호를 입력했다는 사실을 확인하지 않습니다.그것은 문제가 있었고 그가 다시 시도해야 한다는 것을 명확하게 명시하지 않았다.대신 대화상자는 사용자에게 "The site says: '[realm]"과 같은 암호 정보를 제공합니다.여기서 [realm]은 프로그래머만이 좋아할 수 있는 짧은 영역 이름입니다.

Web Broaderswer 설계자는 대화상자 자체가 단순히 사용자 친화적이라면 인증 대화상자를 어떻게 억제해야 하는지 묻는 사람은 아무도 없다는 점에 주목합니다.제가 로그인 폼을 작성하는 이유는 저희 제품 관리팀이 브라우저 인증 대화상자가 형편없다고 생각하기 때문입니다.

했는데, 의 백엔드 방법으로 , 가 헤더를 했을 경우, 「」는 「」라고 하는 것입니다.URL에 대한 콜이 401을 반환하는 경우, 클라이언트가 헤더를 설정한 경우X-Requested-With: XMLHttpRequest는, 「」, 「Drop」를 실시합니다www-authenticate머리글

단, 디폴트 인증 팝업이 표시되지 않습니다.

에 API가 합니다.X-Requested-With는 " "로 됩니다.XMLHttpRequest이 베스트 프랙티스에 따라서 서버의 동작을 변경하는 것 외에 할 수 있는 것이 아무것도 없는 경우는…

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

  1. HTTP 상태는 401 입니다.
  2. WWW-Authenticate.

응답을 할 수 을 삭제할 수 .WWW-Authenticate로그인 대화상자는 브라우저에 표시되지 않습니다.

수 는, , 필터 해 .WWW-Authenticate머리글

했을 경우 해 주세요) 프롬프트를 한 후 .WWW-Authenticate머리글

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

  1. 플래시의 처리 방법이 다를 수 있으므로(아직 시도하지 않았기 때문에) 플래시 동영상을 요청하면 도움이 될 수 있습니다.

  2. 자신의 서버상에서 액세스 하고 있는 서비스의 「프록시」를 설정해, 인증 헤더를 약간 수정해, 브라우저가 인식하지 않게 할 수 있습니다.

나는 이 질문과 답변이 매우 오래되었다는 것을 깨달았다.하지만 결국 여기에 오게 되었다.아마 다른 사람들도 그럴 것이다.

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

IETF 문서(403):

액세스에 적합하지 않은 유효한 credential을 수신한 서버는 403(Forbidden) 상태 코드로 응답해야 합니다.

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

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

두 번째 줄은 대화 상자를 차단합니다.

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

브라우저는 기능만 하고 있기 때문에 401 상태 코드를 반환하지 않기 위해서는 서버측을 변경해야 한다고 생각합니다.이것은 인증에 실패했을 때 단순히 다시 양식을 반환하는 사용자 지정 인증 양식을 사용하여 수행할 수 있습니다.

Mozilla 랜드에서는 XMLHttpRequest(docs)의 mozBackgroundRequest 파라미터를 true로 설정하면 이러한 대화상자가 억제되어 요구가 단순히 실패합니다.다만, 크로스 브라우저의 서포트가 얼마나 좋은지(브라우저 전체에서 실패한 요청의 에러 정보의 품질이 좋은지 등)는 알 수 없습니다.

jan.vdbergh는 사실입니다.서버측의 401을 다른 상태 코드로 변경할 수 있는 경우 브라우저가 팝업을 포착하여 그릴 수 없습니다.다른 해결 방법은 WWW-Authenticate 헤더를 다른 커스텀헤더로 변경하는 것입니다.왜 다른 브라우저가 지원하지 않는지 모르겠습니다. 파이어폭스 일부 버전에서는 mozBackgroundRequest로 xhr 요청을 할 수 있지만 다른 브라우저에서는 할 수 있습니까?여기, 크롬에 이 이슈와 관련된 흥미로운 링크가 있다.

MVC 5 및 VPN에서도 같은 문제가 발생하고 있습니다.VPN을 사용하여 DMZ 밖에 있을 때는 항상 이 브라우저 메시지에 응답해야 합니다..net을 사용하여 에러 루팅을 처리할 수 있습니다.

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

지금까지는 홈 컨트롤러 아래의 인덱스 액션이 사용자를 검증하기 때문에 작동했습니다.로그온에 실패하면 이 액션의 뷰에는 LDAP 쿼리를 사용하여 사용자를 로그인하기 위해 사용하는 로그인 컨트롤이 디렉토리 서비스로 전달됩니다.

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

지금까지 정상적으로 동작하고 있습니다만, 아직 테스트중이며, 상기의 코드는 실행할 이유가 없기 때문에, 삭제의 대상이 되고 있습니다.현재 테스트에는 두 번째 코드 세트가 더 이상 쓸모가 없는 경우를 발견하는 작업이 포함됩니다.다시 말씀드리지만, 이것은 진행 중인 작업입니다만, 도움이 되거나 아이디어를 내기 위해 머리를 짜낼 수 있기 때문에, 지금 추가하기로 했습니다.모든 테스트가 완료되면 최종 결과로 업데이트 하겠습니다.

저는 Node, Express & Passport를 사용하고 있는데, 같은 문제로 고민하고 있었습니다.동작시키기 위해 명시적으로 설정했습니다.www-authenticateheader를 빈 문자열로 변환합니다.제 경우에는 이렇게 생겼습니다.

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

그게 도움이 됐으면 좋겠네요!

최근 삼성 타이젠 스마트 TV용 웹 앱을 개발하던 중 비슷한 상황을 겪었습니다.로컬 네트워크 전체를 스캔해야 했지만 "www-authenticate" 헤더가 연결된 "401 Unauthorized" 응답을 반환하는 IP 주소는 거의 없었습니다.기본 인증 유형(https://developer.mozilla.org/en-US/docs/Web/HTTP/Authentication)) 때문에 사용자가 "사용자 이름"과 "비밀번호"를 입력해야 하는 브라우저 인증 팝이 떴습니다.

이것을 없애기 위해서, 간단하게 기능한 것은, Fetc Api Call(https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch))의 credential을 설정하는 것입니다.공식 문서에는 다음과 같이 기재되어 있습니다.

브라우저가 요청에 자격 증명을 포함하지 않도록 하려면 자격 증명 'omit'를 사용하십시오.

fetch('https://example.com', {
  credentials: 'omit'
})

C#을 안 쓰시는 분들을 위해ActionAttribute그것이 돌아오다400대신401및 'swallows' 기본 인증 대화상자.

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
}

이것으로 시간을 절약하시길 바랍니다.

언급URL : https://stackoverflow.com/questions/86105/how-can-i-suppress-the-browsers-authentication-dialog

반응형