2009-05-30 19 views
13

Tôi đang viết một số chức năng động bên trình duyệt và sử dụng Xác thực cơ bản HTTP để bảo vệ một số tài nguyên. Trải nghiệm người dùng rất quan trọng và được tùy chỉnh cao.Làm thế nào để giữ cho Firefox không cho tên người dùng/mật khẩu với HTTP cơ bản Auth với JQuery AJAX?

Dưới đây là một phương pháp JQuery kiểm tra đơn giản mà cuối cùng sẽ kiểm tra nếu người dùng đã cung cấp các chứng chỉ đúng trong một hình thức:

$(document).ready(function() { 
    $("#submit").click(function() { 
    var token = Base64.encode($('#username').val() + ':' + $('#password').val());   
    $.ajax({ 
     url: '/private', 
     method: 'GET', 
     async: false, 
     beforeSend: function(req) { 
     req.setRequestHeader('Authorization', 'test:password'); 
     }, 
     error: function(request, textStatus, error) { 
     if (request.status == 401) { 
      alert('401'); 
     } 
     } 
    }); 
    return false; 
    }); 
}); 

Nếu họ không được phép để truy cập /private, tại thời điểm này họ sẽ thấy chỉ hộp cảnh báo. Tuy nhiên, trên Firefox, biểu mẫu đăng nhập do trình duyệt cung cấp bật lên (để thử lại bằng thông tin đăng nhập mới). Safari không làm điều này.

Chúng tôi muốn kiểm soát hoàn toàn trải nghiệm với biểu mẫu tùy chỉnh, mờ dần, chuyển tiếp, v.v. Làm cách nào để giữ hộp mặc định của Firefox không hiển thị? (. Nếu đây sẽ là một vấn đề khi chúng tôi kiểm tra cho IE, tôi muốn nghe ý kiến ​​các giải pháp đó, quá)

+1

Lưu ý việc theo dõi tại http://stackoverflow.com/questions/928967/can-i-coerce-apache-into-not-including-a-www-authenticate-header-for-failed-http. –

Trả lời

3

Thật không may, tôi đang gặp vấn đề tương tự ở đây.

Theo ý kiến ​​của tôi, Trình duyệt sẽ không đưa ra lời nhắc cho xmlhttprequest. Tôi thực sự muốn một người nào đó sẽ thúc đẩy điều đó khiến mọi người thực sự muốn chuyển sang jQuery cho các nhu cầu xác thực của họ. Đây là trợ giúp tôi có thể cung cấp cho bạn, tôi đã tìm thấy điều này về jQuery Digest, tôi không biết nó thực sự làm gì hay bất cứ điều gì, nhưng nếu ai đó có thể lấy mã này đúng cách, chúng ta có thể có một xác nhận tiêu hóa jquery hệ thống.

https://www.openhub.net/p/digestj

Tôi nghĩ rằng với tùy chọn AuthDigestDomain mới tiện dụng này, chúng tôi có thể có kịch bản trên được viết lại hoặc bất cứ điều gì và có diện tích bảo đảm 'liên kết' với nhau và chúng ta có thể vượt qua vấn đề này một lần và cho tất cả. Vâng ... best of luck =)

35

Giải pháp là đặt tiêu đề WWW-Authenticate thành một thứ khác không phải là Basic. Ví dụ đặt nó là:

WWW-Authenticate: None 

hoặc

WWW-Authenticate: FormBased 

nếu bạn sử dụng mẫu đăng nhập dựa. Sau đó trình duyệt sẽ không hiển thị cho bạn một cửa sổ đăng nhập.

+1

Như được nêu trong bình luận câu trả lời của câu hỏi liên quan. 'WWW-Authenticate' sẽ chỉ ra một (hoặc nhiều) thử thách hợp lệ. Và tôi cũng nghĩ rằng 'Không có' không phải là một thực tế. http://stackoverflow.com/questions/1748374/http-401-whats-an-appropriate-www-authenticate-header-value#comment-33722946 – mems

+1

Vui lòng xem tại đây giải pháp về cách giải quyết vấn đề này với Java và ** Bảo mật mùa xuân **: http://stackoverflow.com/questions/19079687/rest-call-on-expired-session-http-401-response-causes-browser-to-display-login/19102959#19102959 – lanoxx

+1

Đó là * giải pháp *, mặc dù nhìn không đều. https://www.ietf.org/rfc/rfc2617.txt (4.6) chỉ định nhiều lược đồ, tuy nhiên không giới hạn đối với Basic, Digest, v.v.Vì vậy, nó lên đến khách hàng (trình duyệt) để hỗ trợ một chương trình hay không, nếu chương trình không được hỗ trợ, trình duyệt không tương tác người dùng. Tôi sử dụng phương pháp này cho dự phòng trong suốt từ Windows SSO (SPNEGO) đến một hình thức đăng nhập đơn giản. BTW: chỉ hoạt động đáng tin cậy trong Chrome + IE khi truy cập máy chủ qua tên máy chủ; không sử dụng IP. – comeGetSome

Các vấn đề liên quan