【问题标题】:Returning to Calling Page Within an Area Using UrlReferrer使用 UrlReferrer 返回区域内的调用页面
【发布时间】:2010-12-10 16:21:57
【问题描述】:

我使用 ASP.NET MVC2 Web 应用程序创建了一个新的 MVC2 项目,它为我提供了默认网站。我添加了一个简单的区域,其中有一个 Home Controller 和一个 Index 视图。这导致了编译器给出的第一个问题“找到了与控制器名称'Home'匹配的多种类型”。我将 Home 更改为 Main 并编译。

我添加了一个新选项卡来引用我所在区域的索引视图,打开网站并开始单击选项卡。访问Area index页面时,如果不更改菜单就无法返回Home或About页面,如下:

<ul id="menu">              
     <li><%= Html.ActionLink("SampleArea.Main", "Index", "Main", new { area = "SampleArea" }, null)%></li>
     <li><%= Html.ActionLink("Home", "Index", "Home", new { area = "" }, null)%></li>
     <li><%= Html.ActionLink("About", "About", "Home", new { area = "" }, null)%></li>
</ul>

然后我可以正确地循环浏览选项卡。然后我在 Account 控制器的 LogOff 视图中更改了代码,如下所示:

public ActionResult LogOff()
{
    FormsService.SignOut();

    //return RedirectToAction("Index", "Home");
    return RedirectToAction(Request.UrlReferrer.AbsolutePath.ToString());
}

如果用户注销,我正在使用 UrlReferrer.AbsolutePath 返回调用页面。如果调用页面恰好是 SampleArea 中的视图,.AbsolutePath 包含“/SampleArea”。这是因为控制器和视图是默认的,所以它们不包括在内。随着它的继续,我收到以下错误消息:

找不到资源。
说明:HTTP 404。资源 您正在寻找(或其中之一 依赖项)可能已被删除, 它的名字被改变了,或者是 暂时不可用。请 查看以下 URL 并确保 它拼写正确。

请求的 URL:/Account/SampleArea

我的理解是 /Account 已添加,因为这是执行 LogOff 时它所在的控制器。它认为 /SampleArea 是一个动作,因此添加了当前控制器来完成路由。

使用 UrlReferrer.AbsolutePath,有什么方法可以将 SampleArea 指定为一个区域,或者我可以做些什么来返回正确的页面?

新增功能
这比我想象的还要奇怪。我打开了我目前正在开发的网站,并将视图 LogOut 中的 return 语句更改为使用 AbsolutePath 返回。断点显示它包含“/Club/PrivacyPolicy”。但是,我收到相同的错误消息,但有以下区别:

请求的 URL:/Login/Club/PrivacyPolicy

为什么它应该在它前面加上 /Login 是一个视图,而不是 /Account 是一个控制器?事实上,它为什么要在它前面加上任何东西呢? /俱乐部/隐私政策 是 Global.asax.cs 中的有效路由。

【问题讨论】:

  • 这并不能直接回答您的问题,但我会小心依赖 UrlReferrer,因为某些代理服务器和防火墙会将其从响应中剥离出来作为安全措施。
  • 这是为什么呢?肯定是系统设置的值,应该没有恶意注入的提示吧?
  • referrer 经常被防火墙、防病毒软件、代理等切断。因此,您不应将代码逻辑依赖于这些数据。

标签: asp.net asp.net-mvc-2 areas


【解决方案1】:

我终于弄清楚了如何返回到您触发 LogOn 或 LogOut 请求时所在的页面。我使用了以下代码。

Html.ActionLink("Member LogOn", "LogOn", "Account", new { area = "", returnUrl = HttpContext.Current.Request.RawUrl }, null)

这会生成

<a href='/LogIn/LogOn?returnUrl=%2FContactUs'>Member LogOn</a>

例如。

在我的 HttpPost ActionResult LogOn 中,我有

if (!String.IsNullOrEmpty(returnUrl))
{
    return Redirect(returnUrl);
}
    else
{
    return RedirectToAction("Index", "Home");
}

有时我发现我只需要 HttpContext.Request.RawUrl。

我不太清楚为什么它会生成 /LogIn/LogOn 而不是 /Account/LogOn,但它可以按预期工作。

【讨论】:

  • 我找到了它有 /LogIn/LogOn 而不是 /Account/LogOn 的原因。我将视图名称从 LogIn 更改为 LogOn,但我没有更改 Global.aspx 中的路由定义。一旦我改变了它们,它就变成了/Account/LogOn。
  • 上述代码可能导致开放重定向攻击。在 MVC3 中,“if (!String.IsNullOrEmpty(returnUrl))”应编码为“if (Url.IsLocalUrl(returnUrl))”。这是由 Jon Galloway 的最新博客提供的。
猜你喜欢
  • 2013-03-06
  • 1970-01-01
  • 2013-06-24
  • 2010-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多