2010-01-04 18 views
5

Đây là tình huống ...Các phiên vô dụng và các bài đăng dạng trang web chéo

Trang 1) Ứng dụng ASP.NET MVC cho khách hàng đăng nhập, xem và thanh toán hóa đơn, v.v. Trang này đang sử dụng các phiên ASP không cần thiết nhiều phiên chạy trong trình duyệt theo thẻ.

Trang web 2) Trang web công ty có nội dung tĩnh chuẩn. Điều này sẽ có một biểu mẫu nhỏ ở đầu mỗi trang với một biểu mẫu tên người dùng/mật khẩu sẽ đăng lên ứng dụng MVC.

Khi đăng lên ứng dụng MVC, một phiên mới đang được tạo và trang web đang trả lại chuyển hướng 302 có ID phiên trong URL (như mong đợi). Bộ điều khiển có hai phương thức Login, một để xử lý GET, một để xử lý POST. Do chuyển hướng, nó nhấn phương thức GET và nó mất các giá trị biểu mẫu.

Bằng cách thay đổi phương thức trên trang web của công ty để thực hiện biểu mẫu GET thay vì POST, tên người dùng và mật khẩu được lưu trong chuỗi truy vấn sau khi chuyển hướng và tôi có thể xử lý yêu cầu theo cách đó, nhưng tôi muốn thực hiện BÀI ĐĂNG và không chuyển dữ liệu đó vào trong URL.

Đường ruột của tôi nói rằng việc triển khai một số loại HttpHandler tùy chỉnh sẽ cho phép tôi thực hiện việc này, nhưng tôi không chắc chắn nơi tôi có thể liên kết với việc tạo phiên. Một breakpoint tại Session_Start trong global.asax cho thấy ID phiên đã được crated và chuyển hướng đã xảy ra tại thời điểm đó.

Trả lời

2

Tôi tin rằng tôi đã tìm thấy nơi chuyển hướng đang diễn ra cũng như giải pháp khả thi cho nó. Giao diện ISessionIDManager có một phương thức SaveSessionID với tham số "out bool redirect" trên nó. Có vẻ như khi một phiên mới được tạo, trình quản lý phiên mặc định sẽ ghi lại URL bên trong phương thức này và thực hiện chuyển hướng. Tôi đã chơi xung quanh với việc triển khai ISessionIDManager của riêng mình và tôi có thể chặn chuyển hướng, nhưng không có cách nào (mà tôi có thể biết) khi chèn ID phiên vào URL cho phiên cookieless mà không thực hiện chuyển hướng. Server.Transfer không được phép tại thời điểm đó trong vòng đời yêu cầu. Tôi đã thử điều đó nhưng đã nhận được thông báo "Lỗi Thực hiện Yêu cầu Trẻ em".

Sau đó, tôi tìm thấy bài viết này trên Enabling POST in cookieless ASP.NET Applications. Về cơ bản bằng cách liên kết với sự kiện Application_EndRequest, bạn có thể phát hiện chuyển hướng, xóa câu trả lời và giả mạo một bài đăng biểu mẫu tới URL mới chứa ID phiên.

void MvcApplication_EndRequest(object sender, EventArgs e) 
{ 

    HttpApplication application = (HttpApplication)sender; 

    if (application.Request.Form["CorpLogin"] == "1" 
     && application.Response.RedirectLocation != null 
     && application.Response.IsRequestBeingRedirected) 
    { 

     StringBuilder build = new StringBuilder(); 
     build.Append("<html>\n<body>\n<form name='Redirect' method='post' action='"); 
     build.Append(application.Response.RedirectLocation); 

     build.Append("' id='Redirect' >"); 
     foreach (string key in application.Request.Form) 
     { 
      if (key != "CorpLogin") 
       build.Append(string.Format("\n<input type='hidden' name='{0}' value = '{1}'>", (string)key, application.Request.Form[(string)key])); 
     } 

     build.Append("\n<noscript><h2>Object moved <input type='submit' value='here'></h2></noscript>"); 
     build.Append(@"</form> 
     <script language='javascript'> 
     <!-- 
     document.Redirect.submit(); 
     // --> 
     </script> 
     "); 
     build.Append("</body></html>"); 

     application.Response.Clear(); 
     application.Response.ClearHeaders(); 
     application.Response.Output.Flush(); 

     application.Response.Write(build.ToString()); 

    } 
} 

Đây không phải là giải pháp lý tưởng IMHO nhưng có thể đủ khả thi để đáp ứng yêu cầu.

+0

Bạn có thể cho biết cách bạn phát hiện Chuyển hướng trong EndRequest và xóa Phản hồi không? Tôi chỉ cần một chút, tôi nghĩ ... –

0

Khi trang web MVC phát hành chuyển hướng, bạn có tự xử lý bản thân bằng bộ điều khiển hay được nhà cung cấp tư cách định tuyến tự động định tuyến không?

Nếu bạn có thể chặn yêu cầu trước khi chuyển hướng, bạn có thể đặt tên người dùng và mật khẩu trong biến TempData và xử lý nó sau khi chuyển hướng.

+0

Nó đang được chuyển hướng tự động. –

+0

Trang web từ xa nào đăng lên khi người dùng cố gắng đăng nhập? –

+0

Ngay bây giờ tôi chỉ sử dụng máy chủ web VS, do đó, biểu mẫu có bài đăng đến "http: // localhost: 2600/Home/Đăng nhập" và phương thức có dạng ... '[HttpPost] Public ActionResult Đăng nhập (HomeLoginData loginData) { // snip } ' nhưng không bao giờ đến đó vì chuyển hướng với ID phiên mới. Ví dụ: biểu mẫu trang web công ty POST tới http: // localhost: 2600/Home/Đăng nhập và tôi nhận được chuyển hướng 302 đến http: // localhost: 2600 /% 28S% 28lkcfoer1mb1gbf55hi1bqsbn% 29% 29/Trang chủ/Đăng nhập –

0

Bạn đang tìm kiếm một Server.Transfer equivalent in MVC (xem câu trả lời của Simon.)

Nó giống như Request.Redirect nhưng chỉ đơn giản là chuyển chế biến NET đến một trang khác. Nó cũng cho phép duy trì các biến dạng ngay cả trên POST giữa các lần truyền (trong trường hợp này là RouteValueDictionary).

EDIT: (Đáp lại bình luận của bạn # 1)

Dưới đây là một ví dụ về Forms Authentication with MVC. Nếu không biết nội bộ của cơ chế ủy quyền của bạn, tôi không hoàn toàn chắc chắn. Tại bất kỳ thời điểm nào của quy trình "DoLogin", bạn có thể thực hiện chuyển khoản thay vì chuyển hướng.

+0

Nơi sẽ Tôi đánh chặn bài đăng hình thức không phiên đầu tiên để ngăn chặn chuyển hướng 302 mặc định sau khi phiên được tạo? –

+0

Xem bản chỉnh sửa của tôi - có thể nó sẽ chỉ cho bạn đúng hướng. –

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