2012-03-15 25 views
7

Tôi có trang web ASP MVC 3 có biểu mẫu Phản hồi và phải yêu cầu SSL.ASP MVC 3 RequireHttps thuộc tính thay đổi tất cả các liên kết đến https

Bây giờ, tôi có một hành động được gọi là Phản hồi bên trong bộ điều khiển được gọi là 'ContactUs' có trách nhiệm xem và xử lý phản hồi.

Khi tôi sử dụng thuộc tính [RequireHttps] trên hành động đó, nó hoạt động tốt và thay đổi URL thành "https". Tuy nhiên, tôi nhận thấy rằng tất cả các liên kết bên trong trang của tôi hiện đang trỏ đến "https"! Như thể thuộc tính này đã buộc động cơ định tuyến phải áp dụng giống nhau cho tất cả các liên kết !!!

Tất nhiên, SSL chỉ bắt buộc đối với hành động đơn lẻ này và tất cả phần còn lại cần phải có http bình thường.

Có ai cho tôi biết cách giải quyết vấn đề này không?

+0

Tại sao các trang khác của bạn "yêu cầu" chỉ http? Liệu nó có thực sự quan trọng nếu chúng là https hay không, miễn là các trang DO yêu cầu https được mã hóa? –

+0

@Mystere Man: https làm giảm nghiêm trọng hiệu suất máy chủ web. Trên một số cấu hình, nó có thể là một vấn đề lớn. –

+1

@zespri - Trong những ngày trôi qua, https là một tải trọng đáng kể. Hôm nay, tôi đảm bảo với bạn rằng các máy chủ làm việc nhiều hơn để xây dựng các trang hơn là mã hóa nó. Bạn đang nói rằng bạn muốn làm cho trang web của bạn không an toàn hơn là đối phó với sự gia tăng tải nhẹ. Điểm ảo bên dưới là bạn đã tạo tải bằng cách yêu cầu thông tin đăng nhập https và các yêu cầu trong tương lai sẽ không cần xử lý thêm. –

Trả lời

13

Thuộc tính của bạn [RequireHttp] có thể là OK nếu bạn xóa cookie đăng nhập - hoặc bạn sẽ gửi văn bản rõ ràng trên dây. Nó có thể là công việc nhiều hơn nó có giá trị để tránh chi phí nhỏ của các cuộc gọi HTTPS hơn nữa. SO là tất cả về các câu hỏi tái chế và những người dùng khác đọc câu hỏi của bạn có thể nghĩ rằng bạn có thể thả xuống HTTP sau khi đăng nhập, khi đó thường là điều sai trái.

Thuộc tính [RequireHttps] có thể được sử dụng trên loại bộ điều khiển hoặc phương thức hành động để nói "điều này chỉ có thể được truy cập qua SSL". Các yêu cầu không phải SSL tới bộ điều khiển hoặc hành động sẽ được chuyển hướng đến phiên bản SSL (nếu một HTTP GET) hoặc bị từ chối (nếu một HTTP POST). Bạn có thể ghi đè lên RequireHttpsAttribute và thay đổi hành vi này nếu bạn muốn. Không có thuộc tính [RequireHttp] được tích hợp mà ngược lại, nhưng bạn có thể dễ dàng tạo thuộc tính của riêng mình nếu bạn muốn.

Cũng có quá tải Html.ActionLink() có tham số giao thức; bạn có thể chỉ định rõ ràng "http" hoặc "https" làm giao thức. Đây là MSDN documentation trên một quá tải như vậy. Nếu bạn không chỉ định một giao thức hoặc nếu bạn gọi một tình trạng quá tải mà không có tham số giao thức, nó được giả sử bạn muốn liên kết có giao thức giống như yêu cầu hiện tại.

Lý do chúng tôi không có thuộc tính [RequireHttp] trong MVC là không có nhiều lợi ích cho nó. Nó không thú vị như [RequireHttps], và nó khuyến khích người dùng làm điều sai trái. Ví dụ: nhiều trang web đăng nhập qua SSL và chuyển hướng trở lại HTTP sau khi bạn đăng nhập, hoàn toàn sai điều cần làm. Cookie đăng nhập của bạn cũng bí mật như tên người dùng + mật khẩu của bạn và giờ bạn đang gửi nó bằng văn bản rõ ràng trên dây. Bên cạnh đó, bạn đã dành thời gian để thực hiện bắt tay và bảo mật kênh (phần lớn những gì làm cho HTTPS chậm hơn HTTP) trước khi đường dẫn MVC được chạy, vì vậy [RequireHttp] sẽ không đưa ra yêu cầu hiện tại hoặc các yêu cầu trong tương lai nhanh hơn.

+0

Cảm ơn bạn đã trả lời. Tôi nghĩ tôi nên sử dụng LinkExtensions.ActionLink, nhưng tôi không biết cách sử dụng nó đúng cách. bạn có thể giải thích nó cho tôi plz? – Yousi

+0

có thể là một câu hỏi cơ bản, như đã đọc [ở đây] (http://security.stackexchange.com/questions/12531/ssl-with-get-and-post) và [tại đây] (http://stackoverflow.com/ câu hỏi/499591/được-https-urls-mã hóa) 'post' yêu cầu cũng được mã hóa, nhưng muốn biết thời tiết tôi nên trang trí' RequireHttps' trong bài viết cũng? – stom

0

Bạn có thể tạo thuộc tính bộ lọc tùy chỉnh khác để chuyển về http. Hãy thử giải pháp từ câu hỏi này ... Why once SSL is enabled with [RequireHttps] at action level, it remains enabled forever?

+1

Cookie đăng nhập của bạn cũng bí mật như tên người dùng + mật khẩu của bạn và giờ bạn đang gửi nó trong văn bản rõ ràng trên dây. Bên cạnh đó, bạn đã dành thời gian để bắt tay và đảm bảo kênh (phần lớn những gì làm cho HTTPS chậm hơn HTTP) trước khi đường dẫn MVC được chạy, vì vậy [RequireHttp] sẽ không đưa ra yêu cầu hiện tại hoặc tương lai yêu cầu nhanh hơn nhiều. – RickAndMSFT