2010-06-19 33 views
11

Tôi đang gặp một vấn đề với những gì cần là một hình thức đăng nhập đơn giản trong ASP.NET MVC 2. Về cơ bản hình thức của tôi trông một chút gì đó như thế này:ASP.NET MVC - Html.BeginForm và SSL

using (Html.BeginForm("LogOn", "Account", new { area = "Buyers" }, FormMethod.Post, new { ID = "buyersLogOnForm" })) 

tôi có một bộ lọc RequiresHTTPS vào phương pháp đăng nhập Action nhưng khi nó thực thi tôi nhận được thông báo sau

tài nguyên yêu cầu chỉ có thể được truy cập thông qua SSL

.210

Tại thời điểm này, giải pháp duy nhất mà làm việc là để vượt qua trong một htmlattribute hành động thêm như sau:

var actionURL = "https://" + Request.Url.Host + Request.Url.PathAndQuery; 
using (Html.BeginForm("LogOn", "Account", new { area = "Buyers" }, FormMethod.Post, new { ID = "buyersLogOnForm", @action = actionURL })) 

Trong khi làm việc này, tôi tự hỏi a) tại sao tôi đang nhìn thấy vấn đề này ở nơi đầu tiên và b) nếu có là cách đơn giản hơn để đăng lên https từ trang http?

[Chỉnh sửa]

tôi nên đã nói rằng thả xuống đăng nhập sẽ có mặt trên nhiều trang cộng đồng. Tôi không muốn tất cả các trang của mình là HTTPS. Ví dụ: trang hy vọng của tôi - bất kỳ ai cũng có thể thấy - không được dựa trên HTTPS. Về cơ bản tôi cần phải xác định giao thức trong biểu mẫu của tôi nhưng không có ý tưởng làm thế nào để làm điều đó, hoặc nếu nó có thể.

Tôi sẽ đánh giá cao mọi lời khuyên/đề xuất. Cảm ơn trước

JP

Trả lời

11

Bạn có thể sử dụng

<form action =" <%= Url.Action(
"action", 
"controller", 
ViewContext.RouteData.Values, 
"https" 
) %>" method="post" > 
+2

Vấn đề với điều này là không có FormContext được tạo cho biểu mẫu của bạn, vì vậy tất cả người trợ giúp nhập Html sẽ không thêm thuộc tính xác thực được đính kèm vào mô hình xem của bạn ... –

+0

Xem câu trả lời dưới đây bởi Brad J. Điều này KHÔNG an toàn! – Null

6

Sử dụng [RequireHttps] thuộc tính trên cả hai hành động mà làm cho các hình thức và một trong những bạn đang gửi bài đến.

+1

Các thả xuống đăng nhập sẽ có mặt trên nhiều trang cộng đồng. Tôi không muốn tất cả các trang của mình là HTTPS. Ví dụ: trang hy vọng của tôi - bất kỳ ai đều có thể thấy - không được dựa trên HTTPS –

+3

Người dùng có thể bị từ chối nhập tên người dùng và mật khẩu của họ trên trang đăng nhập mà khóa móc không hiển thị trong trình duyệt của họ. Nó được coi là thực hành tốt để sử dụng HTTPS trên các trang đăng nhập. –

+0

Tôi chắc chắn thấy quan điểm của bạn. Tuy nhiên, tôi tin rằng đây là một quyết định thiết kế và không nhất thiết phải là một cái gì đó mà phải là một hạn chế kỹ thuật. Đưa Twitter làm ví dụ về nơi thả xuống như vậy (từ trang không phải https) tăng cường trải nghiệm đăng nhập của người dùng - không yêu cầu tải trang đầy đủ cho hai trường đơn giản. –

4

Cập nhật: Xem lại các ý kiến ​​dưới đây về các lỗ hổng bảo mật của phương pháp này trước khi xem xét việc sử dụng các mã này.

Tôi nhận thấy rằng một ví dụ về mã lai của JP và Malcolm đã hoạt động.

using (Html.BeginForm("Login", "Account", FormMethod.Post, new { @action = Url.Action("Login","Account",ViewContext.RouteData.Values,"https") })) 

Vẫn cảm thấy hơi khó hiểu vì vậy tôi đã tạo trình trợ giúp BeginForm tùy chỉnh. Trình trợ giúp tùy chỉnh là sạch hơn và không yêu cầu https khi chạy cục bộ.

public static MvcForm BeginFormHttps(this HtmlHelper htmlHelper, string actionName, string controllerName) 
    { 
     TagBuilder form = new TagBuilder("form"); 
     UrlHelper Url = new UrlHelper(htmlHelper.ViewContext.RequestContext); 

     //convert to https when deployed 
     string protocol = htmlHelper.ViewContext.HttpContext.Request.IsLocal == true? "http" : "https"; 

     string formAction = Url.Action(actionName,controllerName,htmlHelper.ViewContext.RouteData.Values,protocol); 
     form.MergeAttribute("action", formAction); 

     FormMethod method = FormMethod.Post; 
     form.MergeAttribute("method", HtmlHelper.GetFormMethodString(method), true); 

     htmlHelper.ViewContext.Writer.Write(form.ToString(TagRenderMode.StartTag)); 

     MvcForm mvcForm = new MvcForm(htmlHelper.ViewContext); 

     return mvcForm; 
    } 

sử dụng Ví dụ:

@using (Html.BeginFormHttps("Login", "Account")) 
+0

Nó thực sự không an toàn để làm điều này. Không có lý do gì trong ngày và tuổi này rằng tất cả các trang không thể là https. –

+0

Bạn có thể mở rộng về lý do tại sao điều này không an toàn không? –

+0

Bởi vì nó dễ bị tấn công bởi người trung gian. Trang không được mã hóa có thể bị xâm phạm khi chuyển tiếp và url được sửa đổi để trỏ tới trang web của người khác. Vì người dùng không thể nhìn thấy url mà bạn đang đăng lên, nên không có cách nào để người dùng biết rằng điều này đã xảy ra. Dưới đây là ví dụ http://resources.infosecinstitute.com/mitm-using-sslstrip/ –

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