2008-10-08 27 views
7

我在asp.net mvc頁面的某些操作中使用了身份驗證屬性,以便將人員引用到登錄屏幕(如果他們未通過身份驗證)。我的問題是在他們登錄後將他們返回到引用頁面。我只是跟蹤引用操作和引用控制器,但是當我還需要跟蹤某些參數時,這會變得有問題。有沒有一些漂亮的內置竅門,我不知道?返回到引用頁

回答

3

如果您正在使用FormsAuthentication,當ASP.NET用戶重定向到登錄頁面,網址看起來是這樣的:

http://www.mysite.com/Login?ReturnUrl=/Something 

登錄表單的action屬性應該具有相同的ReturnUrl參數(作爲隱藏輸入或Url的一部分),以便FormsAuthentication可以將其選中並重定向,例如

<form action="Login?ReturnUrl=<%=Html.AttributeEncode(Request.QueryString["ReturnUrl"]) %>"></form> 

<form><input type="hidden" name="ReturnUrl" id="ReturnUrl" value="<%=Html.AttributeEncode(Request.QueryString["ReturnUrl"])"%> /></form> 
2

我做了什麼來達到這個效果可能會過度,我也想看看其他一些方法。不過,這是我的代碼。

請注意它使用Moq來模擬上下文......而且,我還沒有對querystring做過任何事情(我的路由不包含任何querystrings)。

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); 
} 

正如我所說,這也許有點過於複雜:)

+0

就像一個額外的評論,我也使用上面的代碼來修改一些routedata的值。 – Casper 2008-10-08 08:21:09

0

應始終確保引薦來源網址爲您的域名和可信的字符串,他們可以從現身之內。否則,這有可能被用於閃存或其他客戶端技術來執行響應拆分或其他已知和未知的攻擊。

HTTP引用是用戶輸入,它應該像其他任何驗證一樣。