返回推荐页面

时间:2008-10-08 03:26:54

标签: asp.net-mvc authentication

我正在asp.net mvc页面中的某些操作上使用身份验证属性,以便在未经过身份验证的情况下将人员引荐到登录屏幕。我的问题是他们登录后将它们返回到引用页面。我只是跟踪引用操作和引用控制器,但是当我还需要跟踪一些参数时,这就成了问题。我不知道有一些漂亮的内置技巧吗?

3 个答案:

答案 0 :(得分:3)

如果您正在使用FormsAuthentication,当ASP.NET将用户重定向到登录页面时,URL看起来像这样:

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>

答案 1 :(得分:2)

我为实现这一结果所做的工作可能是过度的,我也希望看到其他一些方法。但是,这是我的代码。

请注意它正在使用Moq模拟上下文...而且,我还没有对查询字符串做任何事情(我的路由不包含任何查询字符串)。

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

正如我所说,它可能有点过于复杂:)

答案 2 :(得分:0)

您应该始终确保引荐网址位于您的域中,并确保它们可能来自合理的字符串。否则,这有可能与闪存或其他客户端技术一起使用,例如响应分裂或其他已知和未知的攻击。<​​/ p>

HTTP referer是用户输入,应该像其他任何一样进行验证。