자바스크립트/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) 문제가 발생합니다.두 가지 해결책이 있습니다.
- 브라우저에서 CORS 사용 안 함 - 코드가 액세스하는 리소스와 동일한 원본에 작업이 배치될 때 개발에 유용합니다.
- 서버에서 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와 결합하는 현재 프로젝트에 대해 수행하는 것을 고려하고 있습니다.토큰 역할 공급자)
기본 워크플로우는 다음과 같이 분해되어야 합니다(여기저기 기사를 기준으로).
- "Authorization" 헤더에 base64-encoded type-1 NTLM 메시지를 사용하여 GET 요청을 수행합니다.
- 401 응답의 "WWW-Authenticate" 헤더에서 base64 인코딩된 type-2 NTLM 메시지를 가져옵니다.
- 이전 단계에서 받은 정오에 대해 NTLM 작업을 수행합니다(미안하지만 아직 코드 예제가 없습니다).
- "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
'programing' 카테고리의 다른 글
| 쇼트 코드를 제거하고 콘텐츠를 그 사이에 보관합니다. (0) | 2023.11.04 |
|---|---|
| Python의 subprocess.call과 subprocess.run의 차이점은 무엇입니까? (0) | 2023.11.04 |
| PowerShell 5의 쓰기-호스트 대 쓰기-정보 (0) | 2023.11.04 |
| Maria에서 최대 절전 모드를 사용하는 JPQL 업데이트 쿼리에서 오류 발생DB (0) | 2023.10.30 |
| SQL Server 2008에서 복합 기본 키를 만드는 방법 (0) | 2023.10.30 |