2008-10-08 51 views
7

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

3

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> 
2

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 :)

+0

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

0

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.