2013-08-30 66 views
16

Tôi đang phát triển một ứng dụng dành cho thiết bị di động HTML5, giao tiếp với WebServices. WebCác dịch vụ sử dụng giao thức xác thực NTLM. Tôi gặp khó khăn trong việc xử lý cái bắt tay thông qua JavaScript. NTLM gửi 401 unauthorized làm thư trả lời cho POST của tôi, mà tôi chưa tìm thấy cách nào để trả lời.Xác thực NTLM Javascript/Ajax

Có thể xác thực NTLM bằng JavaScript không? Tôi có nên tạo dịch vụ web proxy không, ví dụ: xác thực cơ bản ở giữa?

gọi jQuery của tôi là một cái gì đó giống như ...

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

Trả lời

4

Theo như tôi đã thấy, không ai đã triển khai Windows tích hợp/NTLM auth với AJAX, mặc dù chúng ta có thể (tôi đang xem xét làm nó cho một dự án hiện tại để kết hợp xác thực mẫu với WindowsTokenRoleProvider)

các công việc cơ bản nên sự cố như thế này (dựa trên bài viết herehere):

  1. làm một yêu cầu GET với type-1 bài viết NTLM base64 mã hóa trong "Authorization" tiêu đề
  2. lấy base64-encoded type-2 thông điệp NTLM ra khỏi "WWW-Authenticate" tiêu đề trong phản hồi 401.
  3. thực hiện thao tác NTLM trên màn hình thu được ở bước trước (xin lỗi tôi chưa có ví dụ mã)
  4. thực hiện lệnh GET cuối cùng với thông điệp NTLM được mã hóa base64-3 trong tiêu đề "Ủy quyền" . Điều này sẽ trả lại số 200.

Thực hiện NTLM qua HTTP là một triển khai CHAP sử dụng HTTP nhiều hơn là yêu cầu HTTP được ủy quyền.

Tôi sẽ cập nhật cho bạn nếu tôi thực sự thực hiện việc này. Xin lỗi tôi không thể giúp đỡ nhiều hơn nữa.

+2

lớn Tóm lại, sẽ đánh giá cao thực hiện ... –

2

Vấn đề là bạn không thể lấy tên miền/người dùng hiện đã đăng nhập qua javascript (hoặc nếu bạn chưa bao giờ tìm được giải pháp).

Nếu bạn đã biết miền, tên người dùng và mật khẩu mà bạn có thể sử dụng một cái gì đó giống như https://github.com/erlandranvinge/ntlm.js/tree/master

Tuy nhiên tôi nghĩ rằng đi xuống phương pháp này cho dấu hiệu duy nhất trên sẽ là bực bội trong thời gian dài.

Chúng tôi đã thực hiện xác thực NTLM trong iframe ẩn và truy cập iframe qua javascript.

+0

này là tốt, lưu ý: không có một cách để làm CORS (hoặc JSONP) sử dụng này như xa như tôi có thể nói. – Gram

0

Bạn không phải trả lời thử thách NTLM (Xác thực Windows tích hợp), trình duyệt của bạn nên làm điều đó cho bạn, nếu được định cấu hình đúng cách. Một số biến chứng khác cũng có thể xảy ra.

Bước 1 - Trình duyệt

Kiểm tra xem trình duyệt có thể truy cập và gửi thông tin của bạn với một ứng dụng web hoặc NTLM bằng cách nhấn các phần mềm bạn đang phát triển trực tiếp đầu tiên.

Bước 2 - JavaScript withCredentials thuộc tính

Các lỗi 401 Unauthorized nhận và các triệu chứng được mô tả là giống hệt nhau khi tôi đã thất bại trong việc thiết lập các thuộc tính 'withCredentials' thành 'true'. Tôi không quen với jQuery, nhưng hãy chắc chắn rằng nỗ lực của bạn trong việc thiết lập thuộc tính đó là thành công.

Ví dụ này làm việc cho tôi:

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.'); 
    } 
}; 

Bước 3 - Server side cho phép CORS (Không bắt buộc)

tôi nghi ngờ một lý do chính người kết thúc tại câu hỏi này là họ đang phát triển một thành phần trên máy trạm của họ với một thành phần khác được lưu trữ ở nơi khác. Điều này gây ra sự cố Cross-Origin Resource Sharing (CORS). Có hai giải pháp:

  1. Tắt CORS trong trình duyệt của bạn - tốt để phát triển khi cuối cùng công việc của bạn sẽ được triển khai trên cùng nguồn gốc với tài nguyên mà mã của bạn đang truy cập.
  2. Bật CORS trên máy chủ của bạn - có nhiều đọc trên internet rộng hơn, nhưng điều này về cơ bản liên quan đến việc gửi tiêu đề cho phép CORS.

Nói tóm lại, để cho phép CORS với các thông tin bạn phải:

  • Gửi yêu cầu '-Control-Allow Access-Origin' tiêu đề phù hợp với nguồn gốc của trang phục vụ ... này không thể '*'
  • Gửi yêu cầu 'Access-Control-Allow-Credentials' với giá trị 'true'

đây là làm việc .NET mẫu mã của tôi trong tập tin Global.asax của tôi. Tôi nghĩ rằng nó khá dễ dàng để xem những gì đang xảy ra và dịch sang các ngôn ngữ khác nếu cần thiết.

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! 
    } 
}