MVC3应用程序重定向到ReturnUrl=%2f

本文关键字:%2f ReturnUrl 应用程序 重定向 MVC3 | 更新日期: 2023-09-27 18:25:07

我在MVC3 web应用程序中使用表单身份验证。我在根web.config中添加了以下内容:

<authentication mode="Forms">
    <forms name=".FormsAuth" loginUrl="~/Home/Index" timeout="2880" />            
</authentication>
<authorization>
    <deny users="?"/>
</authorization>

当我启动应用程序时,它会重定向到http://localhost:22888/Home/Index?ReturnUrl=%2f,而不是http://localhost:22888。如果我删除行<deny users="?">,那么它会正确重定向,但登录后Context.User.Identity.Name不会给出任何值。

请帮忙。

MVC3应用程序重定向到ReturnUrl=%2f

看看如何保护ASP.NET MVC 4应用程序和新的AllowAnonymous属性。

不能使用路由或web.config文件来保护MVC应用程序(任何版本)的安全唯一受支持的保护MVC应用程序的方法是应用Authorize属性。。。

报价

MVC使用路由,不将URL映射到WebForms、PHP和传统web服务器等物理文件位置因此,使用web.config肯定会在您的网站上打开一个安全漏洞

如果这种情况在未来发生变化,产品团队将进行沟通,但目前这毫无例外。

示例:

从默认的ASP.Net MVC项目(internet/intranet)开始。

编辑web.config添加:

<location path="Home">
  <system.web>
    <authoirzation>
      <deny users="*">
    </authoirzation>
  </system.web>
</location>

运行该项目,默认情况下,您将使用default路由/Home/Index,然后您可以看到内容,只需绕过web.config,不对默认模板进行任何更改。为什么?因为ASP.Net管道正在将请求的URL与web.config中指定的位置进行比较。但是,在管道中执行授权事件之后,将进行路由(默认路由或自定义路由),并允许访问所谓的受限区域。

此外,任何MVC Redirect()也将绕过与在授权管道事件之后再次进行路由相同的安全措施。

当我启动我的应用程序时,它会重定向到http://:22888/Home/Index?ReturnUrl=%2f,而不是http://:22888。

如果使用默认模板,授权会存储returnUrl并重定向回值为%2f/Home/Index,即/。如果/,则可以更新AccountsController中的RedirectToAction代码以不附加returnUrl

这是运行时的正确行为。

您告诉引擎拒绝未经身份验证的用户访问,并且登录url位于~/Home/Index

这就是为什么当您导航到默认url /时,引擎会让浏览器转到登录页面并传递返回url,在本例中编码为/

那么问题来了:如果正确的行为困扰着你,你想做什么。

我通过执行两个修改来解决这个问题:

  1. 我删除了拒绝用户="?"web.config文件中的行。但后来我在Context.User.Identity.Name中变为空
  2. 在HttpPost登录方法中,我在使用return View("Home")成功验证后重定向用户。当我把它改为return RedirectToAction("Home")时,我得到了Context.User.Identity.Name中的值

虽然节目有点晚,但如果您仍然有问题,请记住向下查看web.config中的部分,以了解其他授权规则(设置正确或不正确)。在某些情况下,对根目录或子目录中的资源的错误配置可能会导致无休止的重定向。