Tôi đang xây dựng một ứng dụng kiễu góc tương tác với một API được xây dựng với ASP.NET Web API 2. Tôi đang sử dụng Basic Authentication bằng cách gửi một tiêu đề Authorization
với mỗi yêu cầu đòi hỏi xác thực:Tránh OPTIONS yêu cầu preflight với CORS
đoạn góc:
$http.defaults.headers.common['Authorization'] = authHeader;
Yêu cầu:
Accept:application/json, text/javascript
Accept-Encoding:gzip, deflate, sdch
Accept-Language:en-US,en;q=0.8
Access-Control-Max-Age:1728000
Authorization:Basic [base64 encoded credential couplet here]
Connection:keep-alive
DNT:1
Host: blah.com
Origin:http://localhost:9000
Referer:http://localhost:9000/
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/53
Tất cả điều này hoạt động OKAY, nhưng yêu cầu trước OPTIONS
được gửi với mọi yêu cầu GET
hoặc POST
. Điều này ảnh hưởng lớn đến tốc độ cảm nhận của ứng dụng. Tôi đã thực hiện rất nhiều đọc trên CORS "Yêu cầu đơn giản" và có vẻ như là để tránh các yêu cầu preflight OPTIONS
preflight là để tránh thêm bất kỳ tiêu đề tùy chỉnh trong các yêu cầu của tôi. Tôi đã thử rất nhiều nội dung khác như gửi Content-Type
của text/plain
, nhưng có vẻ như tiêu đề Cấp quyền là điều vi phạm yêu cầu "Yêu cầu đơn giản" của CORS.
Vì vậy, có vẻ như tôi có thể phải di chuyển API để sử dụng xác thực/ủy quyền dựa trên mã thông báo. Để tránh các yêu cầu preflight, có vẻ như tôi sẽ cần đặt mã thông báo trong chuỗi truy vấn. Điều này là okay vì nó chỉ là một ứng dụng web nội bộ nhỏ mà sẽ chỉ được truy cập bởi một vài người dùng anyway. Tôi dự định sẽ thực hiện bộ nhớ đệm trên các phản hồi của bộ điều khiển. Vì mỗi yêu cầu đối với một hành động điều khiển sẽ có một mã thông báo khác nhau trong chuỗi truy vấn dựa trên người dùng được xác thực hiện tại, điều này có khiến cho việc lưu vào bộ nhớ cache vô dụng không?
Vì vậy:
- Làm thế nào để tránh yêu cầu preflight (sử dụng tiêu đề tùy chỉnh Authorization nếu có thể)
- Nếu
1.)
là không thể, và tôi di chuyển vào mã thông báo dựa auth, tôi sẽ không thể các phản hồi API bộ nhớ cache cho các hoạt động của bộ điều khiển - Các phương pháp được sử dụng rộng rãi nhất để tránh các yêu cầu preflight mà còn để xác thực người dùng một cách an toàn là gì?
nb Tôi biết có một vài chủ đề khác trên SO và các nơi khác trên web về vấn đề này, nhưng không ai trong số họ có xu hướng cung cấp một câu trả lời dứt khoát về việc liệu nó có thể để tránh yêu cầu preflight cho GET
s và POST
s khi sử dụng các tiêu đề ủy quyền tùy chỉnh HTTP
.
1.) Hiện chưa khả thi trên tất cả các trình duyệt và phương thức HTTP: https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Preflighted_requests – tyler
Bạn sẽ có thể sử dụng [XMLHttpRequest withCredentials] (https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Requests_with_credentials) để gửi yêu cầu không được đặt trước bằng cookie ủy quyền. – dave