programing

자바스크립트/Ajax NTLM 인증

elecom 2023. 11. 4. 09:51
반응형

자바스크립트/Ajax NTLM 인증

저는 HTML5 모바일 앱을 개발하고 있습니다.WebServices. 웹 서비스는 NTLM 인증 프로토콜을 사용합니다.자바스크립트로 악수하는 것이 어렵습니다.NTLM은 다음을 전송합니다.401 unauthorized제 게시물에 대한 답변으로, 답변할 방법을 찾지 못했습니다.

자바스크립트로 NTLM 인증이 가능합니까?기본 인증을 사이에 두고 프록시 웹 서비스를 구축해야 합니까?

나의 jQuery 전화는...

$.ajax({
                    type: "POST",
                    url: URL,
                    contentType: "text/xml",
                    dataType: "xml",
                    data: soapRequest,
                    username: 'username',
                    password: 'password',
                    xhrFields: {
                        withCredentials: true
                    },
                    success: processSuccess,
                    error: processError
});

NTLM(Integrated Windows Authentication) 문제에 응답할 필요가 없으며, 적절하게 구성된 경우 브라우저에서 대신 수행해야 합니다.여러 가지 추가적인 합병증도 발생할 가능성이 높습니다.

1단계 - 브라우저

브라우저가 NTLM 웹 응용 프로그램으로 액세스하여 자격 증명을 전송하거나 개발 중인 소프트웨어를 직접적으로 눌러 보낼 수 있는지 확인합니다.

2단계 - 자격 증명 속성을 가진 자바스크립트

'withCredentials' 특성을 'true'로 설정하지 못한 경우에 수신된 401 Unauthorized 오류와 설명된 증상은 정확히 동일합니다.저는 jQuery에 익숙하지 않지만 해당 속성을 설정하려는 시도가 성공했는지 확인합니다.

이 예는 제게 도움이 됩니다.

var xhttp = new XMLHttpRequest();
xhttp.open("GET", "https://localhost:44377/SomeService", true);
xhttp.withCredentials = true;
xhttp.send();
xhttp.onreadystatechange = function(){
  if (xhttp.readyState === XMLHttpRequest.DONE) {
    if (xhttp.status === 200)
      doSomething(xhttp.responseText);
    else
      console.log('There was a problem with the request.');
  }
};

3단계 - 서버측 CORS 활성화(옵션)

저는 사람들이 다른 곳에서 다른 구성요소를 호스팅하고 워크스테이션에서 하나의 구성요소를 개발하기 때문에 이 질문에 이르게 된다고 생각합니다.이로 인해 CORS(Cross-Origin Resource Sharing) 문제가 발생합니다.두 가지 해결책이 있습니다.

  1. 브라우저에서 CORS 사용 안 함 - 코드가 액세스하는 리소스와 동일한 원본에 작업이 배치될 때 개발에 유용합니다.
  2. 서버에서 CORS를 활성화합니다. - 더 넓은 인터넷에서 읽을거리가 충분하지만, 기본적으로 CORS를 활성화하는 헤더를 보내는 것을 포함합니다.

간단히 말해 자격 증명으로 CORS를 활성화하려면 다음 작업을 수행해야 합니다.

  • 제공된 페이지의 원본과 일치하는 'Access-Control-Allow-Origin' 헤더 전송...'*'일 수 없습니다.
  • 값이 'true'인 'Access-Control-Allow-Credentials' 전송

여기 제 작품이 있습니다.내 global.asax 파일의 NET 코드 샘플.상황을 파악하고 필요한 경우 다른 언어로 번역하는 것이 꽤 쉽다고 생각합니다.

void Application_BeginRequest(object sender, EventArgs e)
{
    if (Request.HttpMethod == "OPTIONS")
    {
        Response.AddHeader("Access-Control-Allow-Methods", "GET, POST");
        Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept");
        Response.AddHeader("Access-Control-Max-Age", "1728000");
        Response.End();
    }
    else
    {
        Response.AddHeader("Access-Control-Allow-Credentials", "true");

        if (Request.Headers["Origin"] != null)
            Response.AddHeader("Access-Control-Allow-Origin" , Request.Headers["Origin"]);
        else
            Response.AddHeader("Access-Control-Allow-Origin" , "*"); // Last ditch attempt!
    }
}

제가 본 바로는 아무도 AJAX와 함께 Windows Integrated/NTLM auth를 구현하지 않았습니다. (폼 인증을 Windows와 결합하는 현재 프로젝트에 대해 수행하는 것을 고려하고 있습니다.토큰 역할 공급자)

기본 워크플로우는 다음과 같이 분해되어야 합니다(여기저기 기사를 기준으로).

  1. "Authorization" 헤더에 base64-encoded type-1 NTLM 메시지를 사용하여 GET 요청을 수행합니다.
  2. 401 응답의 "WWW-Authenticate" 헤더에서 base64 인코딩된 type-2 NTLM 메시지를 가져옵니다.
  3. 이전 단계에서 받은 정오에 대해 NTLM 작업을 수행합니다(미안하지만 아직 코드 예제가 없습니다).
  4. "Authorization" 헤더에서 base64 인코딩된 type-3 NTLM 메시지를 사용하여 최종 GET을 수행합니다.이것은 200을 돌려줄 것입니다.

HTTP를 통한 NTLM 인증은 공인된 HTTP 요청이라기 보다는 HTTP를 사용한 CHAP 구현에 가깝습니다.

제가 실제로 이를 실행할 수 있게 된다면 업데이트하겠습니다.더 이상 도움이 되지 못해서 죄송합니다.

문제는 자바스크립트를 통해 현재 로그인된 도메인/사용자를 얻을 수 없다는 것입니다(또는 가능하다면 해결책을 찾을 수 없습니다).

도메인, 사용자 이름 및 암호를 이미 알고 있다면 https://github.com/erlandranvinge/ntlm.js/tree/master 과 같은 것을 사용할 수 있습니다.

하지만 저는 싱글 사인온을 위해 이 방법을 사용하는 것은 장기적으로 어려울 것이라고 생각합니다.

숨겨진 iframe에서 NTLM 인증을 하고 javascript를 통해 iframe에 접속하게 되었습니다.

네 NTLM은 재미가 없어요.하지만 여러분은 이것을 시도해보고 싶을지도 모릅니다, https://github.com/tcr/node-ntlm/blob/master/README.md .

언급URL : https://stackoverflow.com/questions/18527749/javascript-ajax-ntlm-authentication

반응형