1

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

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

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

请帮忙。

4

4 回答 4

4

查看保护您的 ASP.NET MVC 4 应用程序和新的 AllowAnonymous Attribute

您不能使用路由或 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>

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

此外,任何 MVCRedirect()还将绕过与在授权管道事件之后再次发生路由相同的安全措施。

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

如果您使用的是默认模板,则授权存储并returnUrl重定向回/Home/Index值为. 您可以更新 中的代码以不附加if it is 。%2f/RedirectToActionAccountsControllerreturnUrl/

于 2013-07-27T19:22:58.203 回答
2

这是运行时的正确行为。

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

这就是为什么当您导航到默认 url 时/,引擎会让浏览器转到登录页面并传递返回 url,/在这种情况下进行编码。

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

于 2013-07-27T19:22:01.153 回答
0

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

  1. 我删除了拒绝用户='?' 来自 web.config 文件的行。但是后来我变得空了Context.User.Identity.Name
  2. 在 HttpPost 登录方法中,我在使用return View("Home"). 当我将其更改为时,return RedirectToAction("Home")我得到了价值Context.User.Identity.Name
于 2013-07-27T19:45:52.517 回答
0

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

于 2014-04-14T18:08:55.267 回答