【发布时间】:2010-09-15 22:11:00
【问题描述】:
我在 asp.net mvc 页面中的某些操作上使用了身份验证属性,以便在人们未通过身份验证时将其引至登录屏幕。我的问题是在他们登录后将他们返回到引荐页面。我只是在跟踪引荐动作和引荐控制器,但是当我还需要跟踪某些参数时,这就会出现问题。是否有一些我不知道的漂亮内置技巧?
【问题讨论】:
标签: asp.net-mvc authentication
我在 asp.net mvc 页面中的某些操作上使用了身份验证属性,以便在人们未通过身份验证时将其引至登录屏幕。我的问题是在他们登录后将他们返回到引荐页面。我只是在跟踪引荐动作和引荐控制器,但是当我还需要跟踪某些参数时,这就会出现问题。是否有一些我不知道的漂亮内置技巧?
【问题讨论】:
标签: asp.net-mvc authentication
如果您使用 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>
【讨论】:
我为达到这个结果所做的工作可能有些过头了,我还想看看其他一些方法。但是,这是我的代码。
请注意它使用 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);
}
正如我所说,这可能有点过于复杂:)
【讨论】:
您应始终确保引用 URL 位于您的域中,并且它们可能来自一个合理的字符串。否则,这有可能与闪存或其他客户端技术一起用于执行响应拆分或其他已知和未知攻击等操作。
HTTP 引用是用户输入,它应该像其他任何内容一样进行验证。
【讨论】: