Tôi đang sử dụng thuộc tính xác thực trên một số hành động của mình trong trang asp.net mvc để giới thiệu mọi người đến màn hình đăng nhập nếu họ chưa được xác thực. Vấn đề của tôi là trả lại chúng cho trang giới thiệu sau khi chúng đã đăng nhập. Tôi chỉ theo dõi hành động giới thiệu và bộ điều khiển tham chiếu nhưng điều đó trở nên có vấn đề khi tôi cũng cần theo dõi một số tham số. Có một số mẹo được xây dựng tiện lợi mà tôi không biết?Quay lại trang giới thiệu
Trả lời
Trong trường hợp bạn đang sử dụng FormsAuthentication, khi ASP.NET chuyển hướng người dùng đến trang đăng nhập, URL trông giống như sau:
http://www.mysite.com/Login?ReturnUrl=/Something
Thuộc tính hành động của biểu mẫu đăng nhập phải có cùng tham số ReturnUrl (dưới dạng đầu vào bị ẩn hoặc là một phần của Url) để FormsAuthentication có thể chọn và chuyển hướng, ví dụ:
<form action="Login?ReturnUrl=<%=Html.AttributeEncode(Request.QueryString["ReturnUrl"]) %>"></form>
hoặc
<form><input type="hidden" name="ReturnUrl" id="ReturnUrl" value="<%=Html.AttributeEncode(Request.QueryString["ReturnUrl"])"%> /></form>
Những gì tôi đã làm để đạt được kết quả đó có thể làm quá mức, và tôi cũng muốn xem một số phương pháp khác. Tuy nhiên, đây là mã của tôi.
Xin lưu ý rằng nó sử dụng Moq để giả lập một ngữ cảnh ... Và, tôi chưa làm bất kỳ điều gì với chuỗi truy vấn (các tuyến đường của tôi không chứa bất kỳ truy vấn nào).
var urlReferrer = Request.UrlReferrer;
if (urlReferrer != null)
{
var url = "~" + Server.UrlDecode(urlReferrer.PathAndQuery);
// get routecollection
var routeCollection = new RouteCollection();
GlobalApplication.RegisterRoutes(routeCollection);
// mcok context
var context = new Mock<HttpContextBase>();
var request = new Mock<HttpRequestBase>();
context.Expect(ctx => ctx.Request).Returns(request.Object);
// mock request
// TODO: convert querystring to namevaluecollection
// now it's just stripped
if (url.IndexOf('?') > 0)
{
url = url.Substring(0, url.IndexOf('?'));
}
var mock = Mock.Get(context.Object.Request);
// TODO: insert namevaluecollection of querystring
mock.Expect(req => req.QueryString).Returns(new NameValueCollection());
mock.Expect(req => req.AppRelativeCurrentExecutionFilePath).Returns(url);
mock.Expect(req => req.PathInfo).Returns(string.Empty);
// get routedata with mocked context
var routeData = routeCollection.GetRouteData(context.Object);
var values = routeData.Values;
return RedirectToAction(routeData.Values["action"].ToString(), values);
}
Như tôi đã nói, nó có thể là một chút overcomplicated :)
Bạn nên luôn luôn đảm bảo rằng URL giới thiệu nằm trong tên miền của bạn và một chuỗi chính đáng mà họ có thể đến từ. Nếu không, điều này có tiềm năng được sử dụng với flash hoặc các công nghệ phía máy khách khác để thực hiện những việc như tách phản hồi hoặc các cuộc tấn công khác, đã biết và chưa biết.
Tham chiếu HTTP là đầu vào của người dùng và nó phải được xác thực như bất kỳ mục đích nào khác.
- 1. Gửi người dùng trở lại trang giới thiệu
- 2. Giới thiệu lại $ HTTP_POST_VARS bằng PHP 5.3
- 3. Hệ thống giới thiệu trang web
- 4. Quay lại trang trước
- 5. quay lại trang trước
- 6. jquery - quay lại đầu trang
- 7. Tải lại trang trên nút quay lại
- 8. Bạn muốn giới thiệu CMS CMS nào cho trang web?
- 9. ASP - Cách lấy URL của trang web giới thiệu
- 10. Zend Framework: Nhận trang liên kết giới thiệu?
- 11. URL giới thiệu trong php
- 12. Giới thiệu về RenderScript
- 13. Giới thiệu Ocaml
- 14. Kiểm tra giới thiệu
- 15. Giới thiệu về đa luồng
- 16. Quay trở lại nút trong một trang
- 17. Trang làm mới nút quay lại
- 18. C# ASP.NET MVC Quay lại trang trước
- 19. Giới thiệu về lớp System.Linq.Lookup
- 20. Haskell - Giới thiệu về Curried
- 21. Giới thiệu Forall trong coq?
- 22. Sửa URL giới thiệu không hợp lệ
- 23. Nút quay lại Actionbarsherlock không quay lại
- 24. Nhận giới thiệu HTTP khi chuyển hướng
- 25. Mối quan hệ tự giới thiệu Django?
- 26. Giới thiệu API Google Maps 403 Lỗi
- 27. Bạn nên giới thiệu khung CSS nào?
- 28. Giới thiệu về "setf" trong "defun"?
- 29. Chrome.History lấy URL giới thiệu (JS)
- 30. Trong wordpress, làm thế nào để chuyển hướng sau một bình luận trở lại trang giới thiệu?
Giống như nhận xét bổ sung, tôi cũng sử dụng mã ở trên để sửa đổi một số giá trị của định tuyến. – Casper